개발/DX11

[DX3D] Normal Mapping

by Majangnan 2024. 10. 16.

노멀 매핑(법선 매핑)

실제로는 평평한 표면에 불과한 객체에 대해, 마치 복잡한 질감이나 굴곡이 있는 것처럼 빛과 그림자가 반응하도록 만들어 주는 기법.

 

 

노멀 맵

기존에 쓰이는 텍스처에는 RGB 값에 원본의 색이 들어있다면, 노멀 맵은 각 픽셀마다 RGB 색상 자료를 담는 것이 아니라 법선 정보를 담는다는 특징이 있다. 법선 맵의 각 픽셀은 RGB 채널에 압축된 x,y,z 좌표 성분을 담으며, 이 성분들은 하나의 법선 벡터를 정의한다. 

 

오른쪽이 노멀 텍스처

 

 

RGB 채널에는 각 성분마다 0~255까지의 값을 담을 수 있다. 이를 노말 단위벡터인 (-1 ~ 1) 범위로 바꾸어서 계산해주어야 추출한 값을 노말 벡터로 사용할 수 있다. 각 성분의 값을 255로 나누어주면 (0 ~ 1) 범위로 줄어들고(텍스처 샘플링을 하면 0~1 범위로 자동으로 추출이 된다) 거기에 2를 곱한 후 1을 빼주면 (-1 ~ 1) 구간의 원래의 벡터 성분 값을 복원할 수 있다. 

참고로 RGB 채널에 들어있는 벡터 값은 x, y , z 순이 아닌 x, z, y 순으로 들어가 있다. 

 

 

Tangent Space(접공간, 텍스처 공간)

 

 

위 그림인 사각형 RectMesh 위에 주황색의 텍스처를 입힌 그림이다. 텍스처 공간은 사각형 평면에 놓여서 사각형과 접한다. 여기서 사각형 면 법선 N을 도입하면 사각형 평면과 접하며 기저벡터 T, B, N 으로 이루어진 하나의 3차원 좌표계가 형성된다. 이 좌표계로 정의되는 공간을 Tangent Space, 텍스처 공간 또는 접공간 이라고 부른다. 텍스처 좌표들은 바로 이 텍스처 공간 좌표계를 기준으로 한다. 

 

법선 맵의 법선 벡터들은 텍스처 공간을 기준으로 정의되지만 빛은 세계 공간을 기준으로 한다(최종적으로는 ViewSpace). 따라서 Tangent Space 기준 방향을 ViewSpace로 적용시키기 위해 적용시킬 곳(ViewSpace)의 표면 정보 (T, B, N)이 필요하다.

 

예를 들어, 추출한 노말 값이 (1, 0, 0) 이면 ViewSpace 에서 한 픽셀의 Tangent , 노말 값이 (0, 1, 0) 이면 Binormal, 노말 값이 (0, 0, 1) 이면 Normal 이므로, ViewSpace로 변환하기 위한 회전 행렬이 곧

 

[ Tx, Ty, Tz

  Bx, By, Bz

  Nx, Ny, Nz ]

 

이 된다.

 

따라서 노말 값에 위의 회전 행렬을 곱해주면 최종적으로 Tangent Space 방향 정보를 적용시킬 표면의 좌표계로 가져올 수 있다.

 

 

'개발 > DX11' 카테고리의 다른 글

[DX3D] 반사광  (0) 2024.10.10
[DX3D] 반사 벡터  (0) 2024.10.10
[DX3D] Cube Mesh  (0) 2024.10.07
[DX11] 렌더링 파이프라인  (0) 2024.05.09
[DX11] Release 함수  (0) 2024.05.08

댓글