오늘은 법선매핑(노말맵)에 대해 공부하도록 하겠습니다.
오브젝트에 텍스쳐를 입히는 과정을 살펴보도록 하겠습니다.
렌더링되어져서 나온 오프젝트는 색이 입혀져 나옵니다.
근데 DirectX에서는 색이 아니라 단순한 숫자입니다.
그중에서 Shader라면 0~1사이의 소수점의 집합입니다.
폴리곤 표면에는 왠만하면 법선 정보가 들어있습니다.
여기서 천재들의 기지가 발휘됩니다.
텍스쳐가 단순히 Shader상에서 수치값으로 표현가능하다면, 폴리곤의 세부적인 기복의 방향을 텍스쳐로 표현할 수 있지 않을가???
이것이 곧 법선맵 입니다.
법선맵을 사용하면 한장의 사각폴리곤만으로 표면이 울퉁불퉁한 것처럼 보이게 할 수 있습니다.
1. 법선맵이 뭐냐?
위의 그림을 살표보면 4X4의 법선맵을 1장의 삼각 폴리곤으로 단순하게 붙였을때를 나타냅니다.
왼쪽은 붙이기 전으로 1장의 폴리곤에 1개의 법선이 정의되어있습니다.
그리고 오른쪽은 법선맵을 붙었을 경우입니다.
텍스쳐의 픽셀이 감싸는 범위당 법선이 정의되어 있습니다.
이것은 1장의 폴리곤이 픽셀의 크기로 분할되어있는 상태입니다.
분할되는 텍스쳐의 사이즈가 작을수록 세밀화된 음영 표연이 가능해 집니다.
물론 폴리곤이 실제로 분할되는 것은 아니기떄문에 Vertex(정점) 수는 증가되지 않습니다.
따라서 단순히 텍스쳐의 눈속임으로 퍼포먼스와 퀄리티를 둘다 잡을 수 있는게 가장 큰 매력입니다.
2. 법선맵의 포맷
법선맵의 1픽셀은 1개의 법선이 저장됩니다.
법선이라는 것은 벡터입니다. 즉 X,Y,Z의 3개의 성분이 필요합니다. 하지만 그걸 색상 RGB로 표현할수있습니다.
그럼 법선맵의 XYZ축은 무었일가요?
폴리곤의 UV좌표공간을 기준으로 하는것이 일반적입니다.
이 공간에다가 RGB각 성분을 넣게됩니다.
아래에 사진을 보시면 법선의 x축을 변화시켰을 때의 색의 변화를 보면 아래와 같습니다.
이러한 색상 구분을 통하여 법선의 방향을 수치화 할수 있습니다.
3. 법선맵의 법선을 로컬좌표로
폴리곤에 법선을 붙인다해도 법선의 방향은(0,0,1)과 같은 값으로 되어있습니다.
이걸 이제 로컬좌표로 변환해야합니다.
UV좌표에 있는 1장에 삼각 폴리곤을 추출하면 이러한 형태가 됩니다.
그리고 이것을 로컬좌표 형태로 만들면 아래에 형태가됩니다.
2개의 좌표개가 있는데, 하나는 로컬좌표, 하나는 UV좌표입니다.
UVZ공간을 접선공간(탄젠트공간)이라고 하는데, 이는 텍스쳐용 좌표입니다.
이제 로컬좌표와 폴리곤의 탄젠트공간을 연결해야하는데, 그게 폴리곤의 법선성분입니다. 이는 vertex Shader에서 NORMAR이라는 시멘틱스를 지정하면 구할 수 있습니다. 즉, NORMAR에서 얻은 벡터는 Z축 방향입니다.
그리고 Vertex Shader에서 tangent와 binormal을 통하여 UV의 로컬좌표를 뽑을 수 있습니다.
이를 통해 로컬공간을 접선공간으로 변환시켜 계산하면 계산량이 매우 많이 줄어듭니다.
'개발자 면접 공부 > 그래픽스' 카테고리의 다른 글
쉐이더란? (사용 이유) (0) | 2022.09.04 |
---|---|
벡터 외적을 통한 적이 오른쪽 왼쪽 판별 (0) | 2022.08.03 |
DirectX 깊이 버퍼(Z-Buffer) (0) | 2022.07.22 |
그래픽스 DirectX11렌더링 파이프라인 (0) | 2022.07.21 |
그래픽스 포워드 렌더링, 디퍼드 렌더링 (0) | 2022.07.21 |