게임/Shader

[HLSL] Normal Mapping의 이해

Binceline 2012. 12. 4. 18:01

노멀매핑 쉐이더를 공부하면서 가장 중요한 것은 접선공간에 관련된 것이라고 생각하고 있다.

노멀벡터의 xyz값이 텍스쳐의 rgb값 변수에 저장되어 있다. 그냥 디퓨즈 매핑이나 스페큘러 매핑 쉐이더에서는 

정반사광과 난반사광을 정점쉐이더에서 구현했는데, 노멀 매핑에서는 빛 계산을 픽셀 쉐이더에서 하게 된다. 노멀 맵에서의 현

재 UV좌표에 따른 픽셀 데이터가 바로 노멀 벡터이다. 

법선 맵의 법선벡터들은 표면의 바깥쪽 방향을 법선의 +Z로 두고 만들어져 있다. 그리고 각 표면마다 각각 다른 공간에 있다.

이것을 '접선공간' 또는 '표면(서피스)공간' 이라 하고, 여기서는 접선 공간이라 하겠다. 표면이란 폴리곤이라고 생각하면 된다.

모든 오브젝트들은 따로 설정을 해주지 않는 이상 기본적으로 로컬 공간에 있다. 

접선공간 변환행렬을 구하는 방법(물론, 렌더몽키에서는 법선, 종법선, 접선 벡터를 직접 구하지 않아도 된다. NORMAL, TANGENT, BINORMAL 시맨틱을 이용하면 그냥 구할 수 있다.)

1) 접선 공간의 Z축은 현재 정점의 법선 벡터와 같다.

2) U또는 V좌표를 가져와서 X축 벡터로 삼는다. 이 축 벡터를 '접선' 이라 한다.

3) 1)과 2)에서 구한 두 벡터를 외적하면 Y축 벡터를 구할 수 있다. 이를 '종법선'이라 한다.

그리고

- 접선 T(Tangent) = (Tx, Ty, Tz)

- 종법선 B(BINormal) = (Bx, By, Bz)

- 법선 N(Normal) = (Nx, Ny, Nz);

이라 할 때, 다음과 같은 행기준 행렬이 만들어진다. (노멀라이즈는 다 하고.)


(Tx Ty Tz)

(Bx By Bz)

(Nx Ny Nz)


이렇게 구해진 행렬은 

[로컬 좌표계 -> 접선공간 좌표계] 로의 변환이다. 왜냐하면 이 행렬은 로컬 좌표계에서 표현된 벡터들로 만든 변환행렬이기 때문이다.

하여튼 이제 역행렬을 구해서 [접선공간 좌표계 -> 로컬 좌표계]

를 구한 후, 로컬 좌표계에서 연산을 하던 월드 좌표계에서 연산을 하던 상관없이 그냥 쓰면 된다. 나머지는 간단하므로 책 보

면 기억날 것이다.


여기까지가 현재 내가 이해한 노말 매핑이다, 틀린 부분이 있다면 지나가는 분께서 답글을 해주시길....ㅜㅜ. 생각보다 복잡하네.

반응형