13 — 텍스처 매핑 (Texture Mapping)
출처: SSU 컴퓨터 그래픽스 슬라이드 —
SSU_Intro2CG_13_TextureMapping.pdf주차: 13주차 선행: 10 — 래스터화 (UV 보간), 12 — 조명과 셰이딩 (Phong 모델)
기하를 늘리지 않고 시각적 디테일을 더하는 기술. 오렌지 표면의 오돌토돌함을 폴리곤으로 깎으면 끝이 없지만, 사진 한 장을 "붙이면" 됩니다. 핵심은 UV 좌표, 필터링/밉맵, 그리고 텍스처를 색 이외의 데이터(노멀·높이·환경)로 쓰는 확장입니다.
1. 왜 텍스처 매핑인가
출처: 슬라이드 — Modeling an Orange / Texture Mapping Goal
오렌지를 만든다고 할 때:
- 구에 단색을 칠하면 → 균일 반사라 너무 단순 (벽이나 당구공엔 OK).
- 오돌토돌함을 폴리곤으로 모델링 → 폴리곤이 폭발.
- 텍스처 매핑: 진짜 오렌지를 찍은 사진을 단순 형상에 붙임.
목표: 기하 디테일을 늘리지 않고 시각 디테일을 추가. 같은 8 폴리곤이라도 텍스처가 있으면 완전히 달라 보입니다. 어떤 이미지든 텍스처가 될 수 있습니다.
2. UV 좌표 (Texture Coordinates) ⭐️
출처: 슬라이드 — UV Mapping / Texture Coordinates
2D 텍스처(이미지)를 3D 물체에 입히려면, 각 정점에 2D 텍스처 좌표 (u, v) 를 부여합니다.
- 원점은 왼쪽 아래.
- u, v 는 0~1 범위 (x, y 축).
- 이미지 해상도와 무관 —
(0.87, 0.78)은 어떤 해상도에서도 같은 상대 위치. - 텍스처의 한 점 = 텍셀(Texel = Texture Pixel).
2.1 매핑 과정 ⭐️
- UV 좌표를 이미지 상의 픽셀 위치로 변환 (단순 곱:
(0.87, 0.78) × (1280, 960) = (1113.6, 748.8)). - 그 위치의 색을 골라(sampling) 렌더링(조명 포함)에 사용.
- 삼각형 내부 픽셀의 UV 는 무게중심좌표로 보간 (래스터화 5장 재활용!).
UV 가 정점에만 있으므로, 내부 픽셀은 rasterization 의 barycentric 보간으로 채웁니다. 원근 보정 보간도 여기서 필요.
2.2 텍스처 래핑 (Wrapping) — UV 가 0~1 밖일 때
| 모드 | 동작 |
|---|---|
| REPEAT | 기본값. 텍스처를 타일처럼 반복. |
| MIRRORED REPEAT | 반복하되 매번 거울 반전. |
| CLAMP TO EDGE | 0~1 로 클램프 → 가장자리 픽셀이 늘어남. |
| CLAMP TO BORDER | 범위 밖은 사용자 지정 테두리 색. |
UV 스케일을 1보다 키워 좌표를 0~1 밖으로 밀어내고, 네 가지 래핑 모드를 눌러 가며 비교해 보세요. (방향성 있는 "F" 텍스처라 REPEAT 와 MIRROR 의 차이가 한눈에 보입니다.)
텍스처 래핑 모드 시각화
live3. 텍스처 필터링 (Filtering) ⭐️⭐️
출처: 슬라이드 — Texture Filtering / Aliasing
UV → 픽셀 변환 결과가 정수 좌표가 아닐 수 있습니다 (예: 1113.6). 그래서 샘플링이 필요합니다.
| 필터 | 동작 | 특징 |
|---|---|---|
| Nearest | 중심이 가장 가까운 텍셀 하나 선택 | 빠름, 계단·블록 |
| (Bi)linear | 이웃 텍셀들의 가중평균 (보간) | 부드러움, 약간 흐림 |
Texture Filtering — Nearest vs Bilinear
live8×8 텍스처를 확대(magnify)할 때 샘플 좌표는 정수 텍셀에 딱 떨어지지 않습니다. Nearest 는 가장 가까운 텍셀 하나를 고르고(계단·블록), Bilinear 는 이웃 4개 텍셀의 가중평균(부드러움)을 씁니다. 확대 정도를 조절해 보세요.
3.1 Aliasing (에일리어싱)
텍스처를 점 샘플링하면 가는 줄무늬 등을 놓쳐서(예: 파란 줄을 건너뜀) 깨짐이 생깁니다. 영역 평균(area averaging) 으로 완화합니다.
- 선형 필터링은 렌더 크기 ≈ 텍스처 크기 일 때만 잘 동작.
- 렌더가 훨씬 작을 때(축소, minification)가 문제 → 밉맵이 필요.
3.2 밉맵 (Mipmaps) ⭐️
이미지를 여러 해상도로 미리 만들어 두는 기법.
- 512×512 → 256×256 → 128×128 → … → 1×1 로 필터링해 단계 생성.
- 텍스처 조회 시 가장 적절한 밉맵 레벨을 사용 (보통 가까운 두 레벨을 보간 → trilinear).
멀리 있어 작게 그려지는 면에는 작은 밉맵을 써서 aliasing 과 과도한 텍셀 샘플링을 막습니다.
렌더 크기를 줄여(축소) 보세요. 왼쪽(항상 원본 레벨 점 샘플링)에는 모아레/깨짐이 생기고, 오른쪽(밉맵)은 적절한 레벨을 골라 깔끔합니다. 아래 썸네일 줄에서 현재 선택된 밉맵 레벨이 강조됩니다.
밉맵 & 축소 앨리어싱 (Mipmap Visualizer)
live줄무늬 누락·모아레 발생
사전 평균화로 앨리어싱 없음
4. UV 를 어떻게 부여하나 — 매핑 모양
출처: 슬라이드 — UV Unwrapping / Texture Map Shapes
4.1 UV 언래핑 (Unwrapping)
폴리곤 메시를 3D→2D 로 펼쳐 평면에 까는 작업. 보통 아티스트가 수작업하거나, 자동 언래핑 알고리즘(겹침 없이·매끄럽게·왜곡 적게 최적화)을 쓰되 수동 조정이 종종 필요.
4.2 매핑 형상 4종 ⭐️
| 매핑 | 변환 | 특징 |
|---|---|---|
| Planar Map | 한 좌표 제거(평면 투영) | 한 방향으로 텍스처가 일정(보통 원치 않음) |
| Cylindrical Map | (x,y,z)→(r, θ, height); θ→s, height→t | 위/아래 극단에서 눌림(pinch) |
| Spherical Map | (x,y,z)→구면좌표; 경도→s, 위도→t | 극(pole)에서 눌림 |
| Box Map | 평면 매핑 여러 개 조합 | 단일 평면보다 커버리지 좋음 |
4.3 파라메트릭 곡면
NURBS 같은 파라메트릭 곡면은 이미 (u, v) 로 매개변수화되어 있으므로, 그 (u,v) 를 그대로 (s,t) 텍스처 좌표로 씁니다.
5. 색 이상의 텍스처 — 데이터 저장소 ⭐️⭐️
출처: 슬라이드 — Texture as additional data storage / Normal·Bump·Displacement·Environment
텍스처는 렌더링용 추가 정보를 담은 파일로 볼 수 있습니다. Phong 식의 각 요소를 텍스처로 공급:
- Diffuse Map: (표면 색)
- Specular Map: (반짝임 정도)
그렇다면 노멀 N 도 텍스처에 저장할 수 있을까? → 네, Normal Map.
5.1 Normal Map ⭐️
노멀 벡터를 R,G,B 로 저장한 텍스처. 저폴리 모델의 노멀을 고폴리 모델의 노멀로 바꿔, 폴리곤을 늘리지 않고도 디테일한 조명 효과를 냅니다.
색 인코딩 (탄젠트 공간):
- T(x): −1~+1 → R: 0~255
- B(y): −1~+1 → G: 0~255
- N(z): 0~+1 → B: 128~255
노멀맵이 대체로 푸르스름한 이유: 노멀이 대부분 표면 바깥쪽 +N(0,0,1) 을 향해 B 값이 큼.
5.1.1 탄젠트 공간과 TBN 행렬 ⭐️⭐️
노멀맵의 RGB 는 월드 좌표의 노멀이 아니라, 그 표면 지점에 붙어 있는 국소 좌표계(탄젠트 공간) 기준의 노멀입니다. 이 좌표계의 세 기저가 바로 TBN:
| 기저 | 의미 | 방향 |
|---|---|---|
| T (Tangent) | 탄젠트 | 표면을 따라, 보통 u(텍스처) 증가 방향 |
| B (Bitangent) | 바이탄젠트 | 표면을 따라, v 증가 방향 (T·N 에 수직) |
| N (Normal) | 기하 노멀 | 표면에서 바깥쪽 (정점 노멀) |
저장된 노멀 을 월드 노멀로 바꾸는 건 TBN 행렬을 곱하는 것뿐입니다 — 행렬의 열이 곧 T, B, N:
그리고 조명(Phong)은 평면 노멀 N 대신 이 교란된 노멀 N′ 으로 를 계산합니다 → 정점·실루엣은 그대로인데 음영만 디테일해집니다.
왜 굳이 탄젠트 공간인가? 저장값이 표면 방향과 무관하므로 같은 노멀맵을 어떤 면·어떤 자세에도 재사용할 수 있습니다(타일링·스키닝 애니메이션에도 OK). 평평한 부분의 노멀은 항상 → RGB
(128,128,255)라서 노멀맵이 푸르스름한 것.
아래 3D 씬을 드래그해서 돌려 보세요. 표면 기울기를 바꿔도 오른쪽 "저장값"(= 텍스처에 박힌 RGB)은 그대로지만, 월드의 N′ 은 TBN 을 따라 회전합니다. 저장 노멀과 광원 슬라이더를 움직이면 N′·L 로 음영이 바뀝니다.
탄젠트 공간 & TBN — 노멀맵이 노멀을 바꾸는 법
3D노멀맵은 노멀을 표면에 붙은 좌표계(탄젠트 공간) 기준으로 저장합니다 — 기저는 T(탄젠트) · B(바이탄젠트) · N(기하 노멀). 저장값에 TBN 행렬을 곱하면 월드 노멀 N′ 이 나오고, 조명은 이 N′ 로 계산됩니다. 씬을 드래그해서 돌려 보고, 표면을 기울여도 오른쪽 "저장값"은 그대로인 걸 확인하세요.
b=0.18
n=0.90
5.2 Bump Map
노멀맵과 비슷하지만 흑백 높이맵(height map) 으로 상대 높이를 저장(검정=최소, 흰색=최대) → 이를 노멀로 변환해 사용.
5.3 Normal/Bump 의 한계
실제 정점을 바꾸지 않습니다. 조명만 속이므로 실루엣(윤곽선)은 여전히 평평 — 가장자리에서 들통남.
5.4 Displacement Map ⭐️
높이맵 정보로 실제 정점을 변위(offset) 시킴 → 올바른 실루엣과 self-shadowing. (대신 진짜 기하가 늘어남.)
| Bump/Normal | Displacement | |
|---|---|---|
| 정점 변경 | ❌ (조명만 속임) | ✅ (실제 이동) |
| 실루엣 | 평평(틀림) | 정확 |
5.5 Baking
비싼 계산을 오프라인으로 미리 수행해 텍스처(또는 정점 속성)에 캐싱. 고폴리(78,642 삼각형)의 디테일을 저폴리(768 삼각형)용 노멀맵으로 구워(bake) 넣는 식. 라이트맵·노멀맵·LOD 생성에 사용.
5.6 Environment Mapping ⭐️
주변 환경 이미지를 텍스처로 담아 반짝이는 물체의 반사/굴절을 "해킹". 보통 큐브 매핑(cube map) 으로 구현(360 카메라로 캡처, 구로도 가능).
📝 Knowledge Check: 텍스처 매핑
Texture Mapping
텍스처 매핑의 근본 목적은?
🔗 다음 학습
- 이전: 12 — 조명과 셰이딩
- 다음 (참고): 14 — 레이트레이싱 — ⚠️ 기말 시험범위 제외, 개념만.
- 시험 대비: 기말 대비 — Numerical Hard Mode