[벡터의 외적과 법선 벡터]
3D 환경은 Z축이 추가되기 때문에 물체의 앞면과 뒷면이 생깁니다. 하지만 이 앞면, 뒷면을 컴퓨터는 모르기 때문에 사용자가 정의해줘야합니다. 그래서 앞서 렌더링 파이프라인을 학습하는 과정에서 이에 관련된 세팅 두 가지를 진행했습니다.
- IndexBuffer에서 정점을 그리는 순서 정의해주기
- Rasterizer에서 CCW 설정 해주기
이 설정을 통해 컴퓨터는 법선 벡트를 구할 수 있고, 이 법선 벡터가 어느 방향을 향하고 있는지를 확인하여 어디를 앞면, 뒷면으로 해야할 지 결정할 수 있습니다.
법선 벡터는 특정 표면이나 곡선에 대해 수직인 방향을 나타내는 벡터입니다. 이 벡터는 벡터 두개를 활용하여 구할 수 있습니다. 아래와 같이 정점 4개를 순서대로 그려야한다고 가정해보겠습니다.
이렇게 순서를 정해주면 벡터는 1->2, 2->3, 3->4, 4->1인 4 종류가 생성될 수 있습니다. 여기서 1->2, 2->3 벡터를 따로 분리해보겠습니다.
이제 이 두 벡터를 외적하면, 두 벡터에 대해 수직인 벡터가 생성됩니다. 이 수직인 벡터가 바로 법선 벡터입니다. 하지만 순서에 상관없이 외적을 진행해서는 안되고, 외적 계산 순서를 정해줘야 법선 벡터의 방향을 결정할 수 있습니다.
[노말이란]
법선 벡터를 구하면 이제 물체의 앞뒷면을 구분할 수 있게 됩니다. 하지만 이 법선 벡터를 그대로 쓰는 것은 아닙니다. 먼저 A(1, 2, 3), B(4, 5, 6) 두 벡터로 이것 저것 확인해보겠습니다.
1. 크기
2. 내적
3. θ
4. 외적
여기서 외적된 벡터의 크기는 ||A||||B||sinθ인데, 이 값은 [3.7417×8.7750×0.2238=7.3485]가 되어 크기가 1이 아님이 확인됩니다. 이 값을 그대로 쓰면 이런 저런 문제가 있습니다.
1. Diffuse Light 계산에서 내적 시 둘 다 단위 벡터여야 cosθ가 나옴, 둘 다 1이 아니면 ||n||cosθ가 나오기 때문에 왜곡된 효과가 발생
2. 반사벡터 구하는 과정도 마찬가지
3. 정점 보간 시 픽셀마다 정규화하지 않으면 영역별로 노말 크기가 달라져 셰이딩 처리에 오류 발생
벡터의 크기가 1이어야지 "방향"만을 이용할 수 있기 때문에 단위 벡터로 변경해줘야 합니다. 그래서 보통 처리 시 normalize를 진행해주는데, 이렇게 정규화된 법선 벡터를 노말(Normal)이라고 합니다.
'DirectX11 > 그래픽스' 카테고리의 다른 글
[Graphics] Rendering Pipeline (0) | 2025.06.18 |
---|---|
[Graphics] 드로우콜(Draw Call) (0) | 2025.06.11 |
[Graphics] 포워드 렌더링, 디퍼드 렌더링 (0) | 2025.06.11 |
[Graphics] Normal Mapping (0) | 2025.06.07 |
[Graphics] Lighting (2) | 2025.06.05 |