Appearance
미세 요철 표현의 기본형 「노멀 맵」(2)
[칼럼 핵심 요약]
실제 노멀 맵을 이용한 범프 매핑을 소개하자. 우선은 하이트 맵을 노멀 맵으로 변환. 이어서, 픽셀 쉐이더에서, 노멀 맵을 참조하여 노멀 벡터를 추출하고, 이것을 이용하여 픽셀 단위의 라이팅을 하게 된다.🌐 원문 링크: 微細凹凸表現の基本形「法線マップ」(2) (Mynavi News)
📅 원문 발행일: 2008-05-02 | ✍️ 저자: 西川善司 (니시카와 젠지 / Zenji Nishikawa)
NOTE
💡 현대 그래픽스 관점에서의 발전사 (Modern Retrospective)
- 노멀 맵과 PBR의 결합: 탄젠트 공간 노멀 맵은 현대 물리 기반 렌더링(PBR)의 핵심 요소로, Roughness/Metallic 텍스처와 함께 미세 표면의 기하학적 형태를 완벽하게 근사합니다.
- 실제 지오메트리화: 노멀 맵의 평면적 한계를 극복하기 위해 과거에는 테셀레이션 기반 디스플레이스먼트 매핑을 썼다면, 최신 엔진(UE5 Nanite)은 수억 개의 실제 마이크로 폴리곤을 직접 렌더링함으로써 노멀 맵 트릭 없이도 실측 수준의 기하 디테일을 표현합니다.
📖 본문 해설
[원문 리드문] > 실제 노멀 맵을 이용한 범프 매핑을 소개하자. 우선은 하이트 맵을 노멀 맵으로 변환. 이어서, 픽셀 쉐이더에서, 노멀 맵을 참조하여 노멀 벡터를 추출하고, 이것을 이용하여 픽셀 단위의 라이팅을 하게 된다.
미세 요철의 고저를 농담으로 표현한 하이트 맵으로부터 노멀 맵
노멀 맵의 디자인 툴은 프리웨어나 상업의 양쪽에서 다양한 물건이 릴리스 되고 있지만, 상업 어플리케이션에서는 Pixologic사의 「ZBrsuh」가 유명하다. 또한 ZBrush에서는 다 폴리곤으로 모델링한 미세 요철의 디테일을 저 폴리곤 모델 + 노멀 맵에 떨어뜨려 출력하는 기능에도 대응하고 있다.
Pixologic 사의 "ZBrsuh"에 의한 다 폴리곤 모델로부터의 노멀 맵 생성
혹은, 「흰색을 높은」 「검정을 낮다」라고 정의해, 높이 낮음을 표현하는 하이트 맵(높이 맵, 디스플레이스먼트 맵이라고도 한다)을 준비해, 이 흑백 그레이 스케일의 텍스처로부터, 노멀 맵을 생성한다, 하는 방법도 잘 활용된다. 하이트맵은 흑백의 농담으로 요철을 표현할 수 있으므로, 손으로 그려 미세 요철을 제작할 때에는 직관적이고 알기 쉽다. 앞의 ZBrush는 다 폴리곤 모델을 낮은 폴리곤 + 하이트 맵으로 변환하는 기능도 가지고 있다.
하이트 맵은 미세 요철의 고저 그 자체를 나타내고 있을 뿐이므로, 노멀 맵으로의 변환이 필요하게 된다.
이것은 높이 맵의 각 텍셀에서 인접한 높음과 낮은 값을 결정하고 가로 및 세로 방향에 대한 기울기를 계산합니다. 각 점에서의 노멀 벡터는 거기에서의 횡 방향 기울기와 세로 방향 기울기 모두에 직교하는 벡터이므로 이것을 계산한다. 이것을 하이트 맵의 모든 텍셀 단위로 계산하여 해, 구한 노멀 벡터를 텍스처에 출력해 주면 노멀 맵은 완성된다.
이 하이트 맵으로부터 노멀 맵의 변환 생성은 픽셀 쉐이더를 활용하는 것으로 실시간으로 생성하는 것도 가능하지만, 노멀 맵 자체가 움직이지 않는 것을 알고 있는 경우는, 미리 오프라인으로 사전에 생성해 두는 일도 있다. 반대로 하이트 맵을 움직여, 이것을 리얼타임으로 노멀 맵으로 변환해, 애니메이션하는 미세 요철을 표현하는, 같은 독특한 테크닉도 실현 가능하다. 덧붙여서, 어쨌든 본 연재에서도 취하게 되는 「수면의 리얼타임 잔물결 애니메이션」등의 표현은, 바로 이 테크닉을 이용하고 있다.
그림 2: 하이트맵에서 노멀맵으로 변환된 이미지
🔍 [인포그래픽 도해 한국어 번역: 하이트맵에서 노멀맵으로의 변환 원리]
- 밝은 픽셀 (백색): 높은 지형 / 돌출부 (
) - 어두운 픽셀 (흑색): 낮은 지형 / 함몰부 (
) - 소벨 필터 (Sobel Filter): 인접 픽셀과의
방향 기울기 벡터를 계산하여 RGB(적색: X편차, 녹색: Y편차, 청색: Z수직) 노멀 맵으로 합성
노멀 매핑의 실제
실제 노멀 맵을 이용한 범프 맵핑의 흐름은도 3과 같다.
그림 3: 여기에서 가볍게 소개한 그림을 재게재한다. 픽셀 셰이더 작업의 예--범프 매핑이 완성될 때까지의 개념도. 높이 맵에서 노멀 맵으로의 변환도 픽셀 셰이더에서 수행할 수 있습니다. 노멀 맵은 노멀 벡터를 저장한 텍스처로, 텍셀당 1개의 XYZ로 표현되는 3차원의 노멀 벡터값이 저장되어 있다.
높이 맵을 노멀 맵으로 변환하고, 픽셀 셰이더에서, 노멀 맵을 참조하여 노멀 벡터를 꺼내, 이것을 사용해 픽셀 단위의 라이팅을 한다.
여기서 하나 주의해야 하는 것은, 노멀 맵에 있어서의 노멀 벡터는, 단순히 텍스처라고 하는 평면 위에 구성된 미세 요철면의 방향일 뿐이며, 앞으로 붙여 넣는 폴리곤의 방향을 전혀 고려하고 있지 않다고 하는 것.
노멀 맵은 단지 2D 텍스처이므로 붙여넣는 폴리곤의 좌표계는 전혀 배려되지 않았다. 그래, 좌표계의 통일을 위한 변환 처리가 필요하게 됩니다.
그림 4
가장 직관적인 것은, 노멀 맵으로부터 취한 노멀 벡터를 월드 좌표계나 로컬 좌표계로 그 때마다 변환하는 방법일 것이다. 이 방법을 사용하면 모든 픽셀에서 가져온 노멀 벡터에 대해 좌표계 변환을 계산해야하며 부하가 높습니다.
그 때문에, 버텍스 쉐이더의 시점에서, 픽셀 쉐이더에 건네지는 광원 벡터나 시선 벡터를, 노멀 맵을 적용하는 폴리곤 기준의 좌표계와 텍스처의 좌표계가 딱 맞도록 변환해 두는 수법이 일반화하고 있다. 적용하는 노멀 맵이 고정적인 경우는 노멀 맵 자체를 사전에 오프라인으로 3D 모델의 로컬 좌표계로 변환해 두는 등의 방법도 이용된다. 이 근처의 실천적인 방법의 차이는 3D 게임 엔진 설계 등에 따라 다양하다. (계속)
그림 5
(트라이Z 니시카와 젠지)