본문 바로가기
프로그래밍/공부

[Graphics] 노멀매핑 & 탄젠트 공간

by Sik.K 2023. 6. 24.

인터넷에서 오브젝트 파일을 받게 되면 텍스쳐 맵이 세 장이 나온다. Diffuse와 Specular는 이미 알고 있지만 Normal 맵이라는 텍스쳐 맵이 나오는데 이건 무엇일까?

 

오브젝트는 수많은 정점들로 이뤄져 있다. 각 정점에 텍스쳐 맵을 매핑해서 어떤 텍스쳐를 출력할 것인지 값을 넘겨 받는다. 이 중 노멀 맵은 이미 매핑된 텍스쳐 위에 출력하는 것으로 좀 더 퀄리티가 있어 보이게 하는 기법을 위해 사용된다.

 

출처 - Normal, Displacement and Bump Maps – Adam Mark Lyons (wordpress.com)

왼쪽에 있는 것이 기본 메쉬의 폴리곤이다. 약 사백 만 개의 폴리곤으로 이뤄진 객체의 위에 500개 정도의 폴리곤으로 구성된 노멀 맵을 매핑시켜 만든 결과물이 오른쪽이다.

 

텍스쳐 한 장 만으로는 음영의 효과를 사실적으로 주기가 어렵기 때문에 노멀 매핑을 사용한다. 노멀 매핑은 일반적으로 푸른색으로 구성되는데, 이는 벡터의 값을 RGB에 대응시키는데 RGB는 음수값이 존재하지 않아 0 ~ 0.5는 음수, 0.5 ~ 1은 양수의 값으로 사용한다.

 

이 중 z축의 값인 B는 항상 0.5를 이상의 값을 가지기 때문에 노멀 맵은 일반적으로 푸른색을 가지는 것이다.

 

 


오브젝트가 회전을 할 경우, 단순 매핑된 노멀 맵의 경우 법선의 축이 회전하지 않아 원하지 않은 음영 효과를 가져올 수 있다. 때문에 오브젝트의 표면과 노멀 맵을 대응시켜야 하는데, 이때 필요한 것이 탄젠트 공간이다.

 

표면에 노멀 맵을 대응시킨다는 말은 폴리곤의 법선 벡터의 z축이 항상 플러스 값을 바라보게 해야 하는 것이다.

 

 

탄젠트 공간

 

 

노멀 맵에서 화면 바깥 쪽, 즉 모니터를 향한 방향을 법선 벡터(Normal Vector), U축의 방향을 탄젠트 벡터(Tangent Vector), V축의 방향을 바이노말 벡터(Binormal Vector)라고 한다.

 

쉐이더에서 연산을 다루려면 같은 공간에 있어야 하고, 노멀 맵은 탄젠트 공간에 있기 때문에 공간 변환을 통해 노멀 맵의 값과 연산을 해주어야 한다.

 

 

아직 공부가 모자라기 때문에 더 공부를 하고 포스팅을 수정할 생각이다. 공식이나 실제 구현은 조금 먼 이야기가 될 것 같다.

댓글