Skip to content

미세 요철 표현의 기본형 「노멀 맵」(1)

[칼럼 핵심 요약]
여기까지 실시간 3D 그래픽의 역사와 개념의 부분은 대체로 이해할 수 있었던 것이 아닐까. 이번부터는, 실제로 3D게임 등에서 응용되고 있는 3D 그래픽스 기술의 개념 등에 대해서 세세하게 소개해 나가려고 한다.

🌐 원문 링크: 微細凹凸表現の基本形「法線マップ」(1) (Mynavi News)
📅 원문 발행일: 2008-04-25 | ✍️ 저자: 西川善司 (니시카와 젠지 / Zenji Nishikawa)

NOTE

💡 현대 그래픽스 관점에서의 발전사 (Modern Retrospective)

  • 노멀 맵과 PBR의 결합: 탄젠트 공간 노멀 맵은 현대 물리 기반 렌더링(PBR)의 핵심 요소로, Roughness/Metallic 텍스처와 함께 미세 표면의 기하학적 형태를 완벽하게 근사합니다.
  • 실제 지오메트리화: 노멀 맵의 평면적 한계를 극복하기 위해 과거에는 테셀레이션 기반 디스플레이스먼트 매핑을 썼다면, 최신 엔진(UE5 Nanite)은 수억 개의 실제 마이크로 폴리곤을 직접 렌더링함으로써 노멀 맵 트릭 없이도 실측 수준의 기하 디테일을 표현합니다.

📖 본문 해설

[원문 리드문] > 여기까지 실시간 3D 그래픽의 역사와 개념 부분은 대체로 이해할 수 있었던 것이 아닐까. 이번부터는, 실제로 3D게임 등에서 응용되고 있는 3D 그래픽스 기술의 개념 등에 대해서 세세하게 소개해 나가려고 한다.

여기까지 실시간 3D 그래픽의 역사와 개념의 부분은 대체로 이해할 수 있었던 것이 아닐까. 이번부터는, 실제로 3D게임 등에서 응용되고 있는 3D 그래픽스 기술의 개념 등에 대해서 세세하게 소개해 나가려고 한다.

주로, Xbox 360이나 PS3, 2006년 이후의 PC-3D게임 그래픽스등에서 사용되는 것이 많은 테크닉이나 기술을 중심으로 소개해 간다.

노멀 맵 기술의 상승

2000년, DirectX 8이 발표되어 GPU가 프로그래머블 셰이더 아키텍쳐 베이스가 되어, 가장 보급된 기술이 노멀 맵을 이용한 범프 매핑일 것이다.

그렇다면 먼저 몇 번에 걸쳐 "노멀 맵"의 기술적 개념을 해설함과 동시에 실제 게임 타이틀에서 응용되는 방법을 소개한다.

1 폴리곤 미만의 미세한 요철을 표현하기 위해

실시간 3D 그래픽은 궁극적으로 적절한 해상도의 2D 프레임에 대해 그려집니다. 당연한 일이다.

예를 들어 수백만 폴리곤의 고화질 3D 모델이 있었다고 해서 이를 640×480 도트의 화면으로 표시하면 대부분의 폴리곤이 1픽셀 미만에서만 표시될 것이다.

이것은 극단적인 예이지만, 열심히 세세한 모델링을 해도 실제 표시시에는 그 모델링 정밀도가 낭비되는 경우가 많다는 것이다. 특히 그것이 현저해지는 것이 미세한 요철이다.

예를 들어, 인간의 피부상의 주름, 조약돌이나 벽돌의 이음새는, 벌레나 어류의 비늘, 무기나 장식품에 새겨진 릴리프 모양과 같은 세세한 요철은, 폴리곤으로 모델링한 곳으로, 그것이 표시시에 보상되지 않는 경우가 많다. 보상받지 못할 뿐이라면 아직 좋지만, 폴리곤 데이터로서 존재하면, 그것은 메모리를 보다 많이 소비해 버리고, CPU→GPU에의 3D모델의 전송도 불필요하게 시간이 걸려 버린다. 그리고 실제로는 대부분이 1픽셀 이하로 우울해 버리는데, 그래도 버텍스 쉐이더는 그 미세 요철의 폴리곤의 모두를 처리해야 하기 때문에, 낭비에 고부하를 강하게 된다.

거기서, 발상을 전환해, 세세한 요철이 그렇게 보이면 좋다… 이에 대한 하나의 해가 노멀 맵을 이용한 범프 매핑이다.

이 방법은, 최종적으로 요철이 있는 것처럼 음영이 나오는 것의 재현에 주력해, 거기에 실제의 폴리곤 레벨에서의 세세한 요철은 마련하지 않는 것이 특징이다(대략적인 요철은 마련해 두는 경우가 많다).

노멀 벡터만 있으면 음영을 내는 것에 주목

미세한 요철이 「요철로서 보인다」는 왜일까.

그것은 요철에 밝은 곳이나 어두운 곳이 생기니까--즉 음영이 나오기 때문이다. 그럼 「음영이 나온다」라고 하는 것은, 무엇일까.

이는 라이팅(광원처리)이 이루어지기 때문이다.

그럼 라이팅에 필요한 것은 무엇일까.

반사 방정식에는 그 표현하고 싶은 재질마다 다양한 것이 있지만, 라이팅에 필요한 기본 파라미터는 시점에서 시선을 나타내는 '시선 벡터', 그리고 물체를 비추는 빛의 방향을 나타내는 '광원 벡터'의 2개에 비해 빛에 비추는 면(픽셀, 폴리곤)의 방향을 나타내는 벡터 '노멀 벡터'이다.

노멀 벡터는, 표현하고 싶은 요철에 밀접하게 관련되어 오는 파라미터이며, 그 요철의 노멀 벡터만이 있으면, 이것을 사용해 반사 방정식을 풀는 것으로, 요철다운 음영을 낼 수 있는 것이다.

다만, 실제로는 요철이 없기 때문에, 그 요철이 실제로 있는지 판별하기 어려운 정도의 각도나 원목이 아니면 부자연스러움이 노출되어 버린다. 반대로, 정말로 요철이 있는지 모르는 정도의 매우 미세한 요철의 음영 표현에는 적합하다고 말하게 된다.

그러면 미세 요철의 노멀 벡터를 어떻게 취급하면 좋은 것인가.

최종적으로 미세 요철의 음영은 픽셀 묘화의 결과로서 나오면 좋기 때문에, 즉, 픽셀 단위에 노멀 벡터를 주기 위해서는 무엇이 편리한가를 생각하면 된다.

그러면 대답은 스스로 이끌어 온다. '텍스처'다.

텍스처라고 하면 일반적으로는 폴리곤에 붙이는 화상이나 모양을 연상하기 쉽다.

예를 들어, 이미지 텍스처를 폴리곤에 붙여 넣는 경우, 텍스처에서 읽은 텍셀 (텍스처를 구성하는 픽셀)의 색상을 이제 그려지는 픽셀의 색상으로 만듭니다. 이 텍스처에 미세 요철의 노멀 벡터를 넣어 두고, 텍스처로부터 읽어낸 텍셀을, 노멀 벡터로 간주해, 그 시점에서 픽셀 단위의 라이팅의 반사 방정식을 풀면, 표현하고 싶은 미세 요철의 음영을 낼 수 있게 된다.

일반적인 텍스처의 텍셀은 이미지 텍스처의 경우 α(투명도), R(적색), G(녹색), B(파랑)의 최대 4요소의 색 정보에 할당되어 있지만, 이를 예를 들어 α를 제외한 RGB의 3요소에 노멀 벡터의 x성분, y성분, z성분을 할당하여 기록해 둔다. 렌더링시에는 픽셀 쉐이더로 이 텍스처로부터 텍셀을 꺼냈을 때에, 이 RGB 성분을 노멀 벡터의 xyz 성분으로 간주해 반사 방정식을 풀어 준다.

이 노멀 벡터가 저장된 텍스처를 특히 "노멀 맵"(Normal Map)이라고합니다. 일반적으로, 이 노멀 맵을 활용한 미세 요철 표현은 「노멀 맵을 이용한 범프 맵핑」이라고 부르는 것이 맞을 것이다. 또, 텍스처 맵을 붙여 넣는 것을 텍스처 맵핑이라고 하는데, 이 기법이 「노멀 맵을 붙인다」라고 하는 의미를 담은 「노멀 맵핑(Normal Mapping)」이라고 부르는 일도 많아지고 있다(이어진다).

그림 1: 노멀 맵을 이용한 범프 매핑 개념그림 1: 노멀 맵을 이용한 범프 매핑 개념

(트라이Z 니시카와 젠지)


🔗 연관 지식 베이스 (Wiki)

Based on Zenji Nishikawa's 3D Graphics Maniax series. Translated & Knowledge-Based for Korean Game Developers.