
Normal Mapping
Normal Mapping은 물체에 어떤 Texture을 입힘으로써 물체를 더 세부적으로 표현하는 것인데, 그냥 Texture처럼 이미지를 입히는 것이 아니라 빛과도 상호작용해서 입체감을 더욱 늘린다. 즉 RGB 색상 정보만 가지고 있는 것이 아니라 Normal 벡터까지 가지고 있다. 그렇기 때문에 따로 물체에 정점을 추가할 필요 없이 텍스쳐만으로 더 생동감 있게 표현할 수 있다.

Tangent Space
Tangent Space는 Normal Mapping할 때 사용하는 좌표계이다. Normal Mapping할 때 사용하는 Texture가 파랑색인 이유도 Normal 벡터가 이 좌표계에서 위쪽으로 향하는 경우가 대부분이기 때문이다. Tangent Space는 Pixel마다 하나씩 본인의 공간을 가지고 있다. 그리고 우리는 View에서 Lighting을 계산하고 있기 때문에 Tangent Space의 벡터들을 View 좌표계로 변환해야 한다. Tangent Space는 이동이 없고 방향만 있기 때문에 아래 행렬을 Tangent Space 기준 벡터에 곱해주면 View 좌표계로 변환할 수 있다. (좌표계 변환 행렬 참조)
matTBN:
Tx Ty Tz
Bx By Bz
Nx Ny Nz

코드에서 정점을 만들 때 Normal 벡터와 Tangent 벡터 정보가 있다. Normal 벡터와 Tangent 벡터를 알고 있다면 이 둘의 외적이 Binormal 벡터이다. 왜냐하면 a벡터와 b벡터의 외적은 두 벡터와 직교하고 두 벡터를 포함한 평면과 수직이기 때문이다. Tangent x Normal 순으로 곱해야 한다. 순서가 바뀌면 Binormal이 반대가 된다.
if (g_tex_on_1)
{
// [0,255] 범위에서 [0,1]로 변환
float3 tangentSpaceNormal = g_tex_1.Sample(g_sam_0, input.uv).xyz;
// [0,1] 범위에서 [-1,1]로 변환
tangentSpaceNormal = (tangentSpaceNormal - 0.5f) * 2.f;
float3x3 matTBN = { input.viewTangent, input.viewBinormal, input.viewNormal };
viewNormal = normalize(mul(tangentSpaceNormal, matTBN));
}
그리고 uv좌표를 통해 tangentSpaceNormal을 구해준 후 TBN행렬과 곱해 viewNormal을 구한다. 이것을 Lighting에 적용한다.
'그래픽스' 카테고리의 다른 글
| [DX12] Constant Buffer (0) | 2022.07.22 |
|---|---|
| [DX12] Frustum Culling (0) | 2022.02.28 |
| [DX12] Projection, Screen 변환 행렬 (0) | 2022.02.26 |
| [DX12] World, View 변환 행렬 (0) | 2022.02.26 |
| [DX12] 좌표계 변환 행렬 (0) | 2022.02.25 |