1. 개요

노멀 매핑(Normal Mapping)은 저해상도 폴리곤(Low-poly) 메시의 지오메트리(Geometry)를 변경하지 않고, 픽셀 셰이딩(Pixel Shading) 단계에서 광원(Light) 계산을 조작하여 고해상도(High-poly) 모델처럼 보이게 하는 기법이다.
이는 실제 정점(Vertex)을 변위시켜 굴곡을 만드는 디스플레이스먼트 매핑(Displacement Mapping)과는 다르다. 노멀 매핑은 성능 코스트가 매우 낮고, 실제 지형 변화는 없다.
2. 작동 원리

노멀 매핑의 핵심 원리는 픽셀 셰이더(PS) 단계에서, 모델의 '평평한' 법선(Normal) 벡터 대신, '울퉁불퉁한' 법선이 저장된 특수 텍스처(노멀 맵)를 사용하여 조명 계산을 수행하는 것이다.
2.1. 노멀 맵 (Normal Map)
- 노멀 매핑을 위해 특별히 제작된 텍스처이며, 보통 보라색과 파란색 계열의 이미wl.
- 이 텍스처의 각 픽셀(텍셀)은 RGB 채널을 사용하여 3차원 방향 벡터(Vector) 정보(X, Y, Z)를 저장한다.
- 이 방향 벡터가 바로 법선(Normal)의 방향이다.
2.2. 픽셀 셰이더 (Pixel Shader)에서의 작동
- 텍스처 샘플링: 픽셀 셰이더는 래스터라이저(RS)로부터 보간된 UV 좌표를 받아, 노멀 맵(Normal Map)을 샘플링한다.
- 법선 벡터 교란 (Perturbation): 샘플링을 통해 '가짜' 법선 벡터를 텍스처에서 읽어온다.
- 조명 계산: 픽셀 셰이더는 모델의 원래 법선을 무시하고, 방금 텍스처에서 읽어온 법선(울퉁불퉁함)을 기준으로 앰비언트(Ambient), 디퓨즈(Diffuse), 스페큘러(Specular) 등 모든 광원 계산을 수행한다.
- 결과: 빛은 마치 표면이 실제로 굴곡이 있는 것처럼 반응하여 그림자를 드리우고 하이라이트를 만든다.
3. Image to Normal Map
3.1 Image to Height Map

간단하게 이미지 텍스처를 gray-scale image (height map)로 만든다.
- Height map은 종종 gray scale로 visualized 된다.
- 만약 height가 [0, 255]~[Black, White]~[Lowest, Highest]
3.2 Height Map to Normal Map

3.3 Normal map visualization
normal의 각 성분은 [-1, 1]사이, 따라서 Texture에 저장하기 위해선 [0, 1] (RGP 컴포넌트의 범위)로 변환한다.

3.4 Normal map 사용
Rasterized된 Polygon mesh와 Textrue 좌표를 통해 Normal map에 접근한다.

4. Tangent Space와 World Space
월드 공간 (World Space)
- 게임 씬(Scene)에 존재하는 광원(Light), 카메라(Camera), 모든 3D 객체(Object)의 위치와 방향이 이 공간을 기준으로 정의된다.
탄젠트 공간 (Tangent Space)

- 3D 모델의 표면을 기준으로 하는 국소적인(Local) 좌표 시스템이다.
- 이 좌표계는 텍스처의 UV 좌표 방향과 나란히 정렬된다. 모델링 stage에서 이미 정의 됨.
- TBN 벡터라는 세 개의 축으로 구성된다.
- T (Tangent): 텍스처의 U축(가로)과 나란한 방향의 3D 벡터. (Texture Coordinate의 Basis와 동일한 방향)
- B (Bitangent): 텍스처의 V축(세로)과 나란한 방향의 3D 벡터. (Texture Coordinate의 Basis와 동일한 방향)
- N (Normal): 모델 표면의 원래 법선(Z축 역할) 벡터.
노멀 맵 (Normal Map)

- "색상(Color)"이 아닌 "방향(Vector)" 데이터를 저장하는 특수한 텍스처이다.
- 이 맵에 저장된 법선 벡터(Normal) 값들은 모두 탄젠트 공간을 기준으로 한다. (예: RGB(0.5, 0.5, 1)는 탄젠트 공간의 Z축, 즉 "표면에서 똑바로 튀어나옴"을 의미한다.)
4.1 문제점: 좌표계 불일치
조명 계산(Dot Product, 내적)은 반드시 모든 벡터가 동일한 좌표 공간에 있을 때만 올바르게 작동한다.
하지만 노멀 매핑을 사용할 때, 우리는 두 개의 서로 다른 공간에 있는 벡터를 계산해야 하는 문제에 부딪힌다.
- 광원(Light) 벡터: 월드 공간에 있다.
- 표면 법선(Normal) 벡터: 노멀 맵에서 읽어왔으므로 탄젠트 공간에 있다.
4.2. 해결방법: Space 통일
이 문제를 해결하기 위해, 셰이더는 둘 중 하나의 벡터를 변환하여 같은 공간으로 통일해야 한다.
방법 1: 법선(Normal)을 월드 공간으로 변환
- 방법: 픽셀 셰이더(PS)에서 TBN 행렬(모델의 T, B, N 벡터로 만듦)을 사용하여, 노멀 맵에서 읽은 탄젠트 공간 법선을 월드 공간으로 변환한다.
- 장점: 광원이 이미 월드 공간에 있으므로 계산이 직관적이다.
- 단점: 픽셀의 수(수백만 개)만큼 매번 비싼 행렬 곱셈을 수행해야 하므로, 연산 비용이 매우 높다.
방법 2: 광원(Light)을 탄젠트 공간으로 변환 (권장)
- 방법: 버텍스 셰이더(VS)에서 TBN 행렬을 사용하여, 월드 공간 광원 벡터를 탄젠트 공간으로 미리 변환한다.
- 이후: 래스터라이저(RS)가 이 "탄젠트 공간 광원" 값을 픽셀마다 보간(interpolate)하여 픽셀 셰이더로 넘긴다.
- 장점: 비싼 변환 계산을 픽셀보다 훨씬 수가 적은 버텍스 셰이더에서 끝낸다. 픽셀 셰이더는 이미 변환된 값(탄젠트 공간 광원)과 노멀 맵 값(탄젠트 공간 법선)을 받아 단순 내적(dot)만 수행하면 된다.
- 결론: 이 방식이 성능상 압도적으로 유리하므로, 대부분의 실시간 렌더링에서 이 방법을 채택한다.
5. 노멀 매핑의 장점과 한계
5.1. 장점
- 압도적인 성능: 실제 지오메트리를 추가하지 않고, 픽셀 셰이더에서 텍스처 조회 1회와 약간의 계산만 추가되므로 성능 비용(Cost)이 매우 낮다.
- 높은 디테일: 수백만 개의 폴리곤으로만 표현 가능한 미세한 표면 디테일(예: 흠집, 주름, 모공)을 단 하나의 텍스처로 표현할 수 있다.
5.2. 한계
- 노멀 매핑은 셰이딩 기법일 뿐, 실제 모델의 형상을 변경하지 않는다.
- 실루엣 (Silhouette) 문제: 모델의 외곽선(실루엣)은 여전히 저해상도 모델의 각진 형태를 그대로 유지한다.
- 시차 (Parallax) 없음: 가까이 다가가거나 비스듬히 볼 때, 굴곡이 진짜가 아니라는 것이 쉽게 드러난다.
- 자체 그림자 (Self-Shadowing) 불가: 굴곡이 실제로 튀어나온 것이 아니므로, 튀어나온 부분이 다른 부분에 그림자를 드리울 수 없다. (이는 Parallax Occlusion Mapping(POM) 같은 상위 기법으로 일부 보완 가능하다.)
6. 요약
노멀 매핑은 현대 3D 렌더링에서 성능과 품질에 있어 효율적인 표준 기술이다. 저비용으로 시각적 디테일 향상을 가져오기 때문에 거의 모든 실시간 렌더링에 필수적으로 사용된다.
'그래픽스' 카테고리의 다른 글
| 08. Pixel Shader - Alpha test (0) | 2025.11.05 |
|---|---|
| 08. Pixel Shader - Lighting (0) | 2025.11.04 |
| 08. Pixel Shader - Image Texturing (0) | 2025.11.04 |
| 07. Rasterizer (0) | 2025.11.04 |
| 06. Geometry Shader (0) | 2025.11.04 |