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 매핑 과정 ⭐️

  1. UV 좌표를 이미지 상의 픽셀 위치로 변환 (단순 곱: (0.87, 0.78) × (1280, 960) = (1113.6, 748.8)).
  2. 그 위치의 색을 골라(sampling) 렌더링(조명 포함)에 사용.
  3. 삼각형 내부 픽셀의 UV 는 무게중심좌표로 보간 (래스터화 5장 재활용!).

UV 가 정점에만 있으므로, 내부 픽셀은 rasterization 의 barycentric 보간으로 채웁니다. 원근 보정 보간도 여기서 필요.

2.2 텍스처 래핑 (Wrapping) — UV 가 0~1 밖일 때

모드동작
REPEAT기본값. 텍스처를 타일처럼 반복.
MIRRORED REPEAT반복하되 매번 거울 반전.
CLAMP TO EDGE0~1 로 클램프 → 가장자리 픽셀이 늘어남.
CLAMP TO BORDER범위 밖은 사용자 지정 테두리 색.

UV 스케일을 1보다 키워 좌표를 0~1 밖으로 밀어내고, 네 가지 래핑 모드를 눌러 가며 비교해 보세요. (방향성 있는 "F" 텍스처라 REPEAT 와 MIRROR 의 차이가 한눈에 보입니다.)

텍스처 래핑 모드 시각화

live
래핑 모드
2.00×
UV 정수 경계를 회색 선으로 표시
REPEAT타일 반복 — UV를 소수 부분만 취함
UV 범위
0 ~ 2.00
타일 수
2×2
텍스처 크기
16×16
범위 밖 처리
타일 반복
UV가 [0, 1] 밖일 때의 처리 방식 — REPEAT는 소수 부분만 취해 타일을 무한 반복합니다. MIRRORED REPEAT는 반복하되 홀수 번째 타일을 좌우·상하로 뒤집어 이음새를 부드럽게 합니다. CLAMP TO EDGE는 UV를 [0, 1) 로 고정해 가장자리 픽셀이 늘어나 보입니다. CLAMP TO BORDER는 범위를 벗어난 영역을 미리 지정한 단색(회색)으로 채웁니다. OpenGL 기본값은 REPEAT입니다.

3. 텍스처 필터링 (Filtering) ⭐️⭐️

출처: 슬라이드 — Texture Filtering / Aliasing

UV → 픽셀 변환 결과가 정수 좌표가 아닐 수 있습니다 (예: 1113.6). 그래서 샘플링이 필요합니다.

필터동작특징
Nearest중심이 가장 가까운 텍셀 하나 선택빠름, 계단·블록
(Bi)linear이웃 텍셀들의 가중평균 (보간)부드러움, 약간 흐림

Texture Filtering — Nearest vs Bilinear

live

8×8 텍스처를 확대(magnify)할 때 샘플 좌표는 정수 텍셀에 딱 떨어지지 않습니다. Nearest 는 가장 가까운 텍셀 하나를 고르고(계단·블록), Bilinear 는 이웃 4개 텍셀의 가중평균(부드러움)을 씁니다. 확대 정도를 조절해 보세요.

2.0×
Nearest (point sampling)
계단현상·블록, aliasing 위험
Bilinear (4-texel 가중평균)
부드러운 보간, 흐려짐

3.1 Aliasing (에일리어싱)

텍스처를 점 샘플링하면 가는 줄무늬 등을 놓쳐서(예: 파란 줄을 건너뜀) 깨짐이 생깁니다. 영역 평균(area averaging) 으로 완화합니다.

  • 선형 필터링은 렌더 크기 ≈ 텍스처 크기 일 때만 잘 동작.
  • 렌더가 훨씬 작을 때(축소, minification)가 문제 → 밉맵이 필요.

3.2 밉맵 (Mipmaps) ⭐️

이미지를 여러 해상도로 미리 만들어 두는 기법.

  • 512×512 → 256×256 → 128×128 → … → 1×1 로 필터링해 단계 생성.
  • 텍스처 조회 시 가장 적절한 밉맵 레벨을 사용 (보통 가까운 두 레벨을 보간 → trilinear).

멀리 있어 작게 그려지는 면에는 작은 밉맵을 써서 aliasing 과 과도한 텍셀 샘플링을 막습니다.

렌더 크기를 줄여(축소) 보세요. 왼쪽(항상 원본 레벨 점 샘플링)에는 모아레/깨짐이 생기고, 오른쪽(밉맵)은 적절한 레벨을 골라 깔끔합니다. 아래 썸네일 줄에서 현재 선택된 밉맵 레벨이 강조됩니다.

밉맵 & 축소 앨리어싱 (Mipmap Visualizer)

live
32 px
렌더 크기
32 × 32 px
선택된 밉 레벨
Level 2 (32×32)
축소 비율
4.0×
포인트 샘플링 (앨리어싱)
항상 Level 0(원본)에서 샘플 →
줄무늬 누락·모아레 발생
밉맵 샘플링 (깔끔)
Level 2 (32px)에서 샘플 →
사전 평균화로 앨리어싱 없음
밉맵 체인 — 현재 선택 레벨 강조
L0128px
L164px
L232px
L316px
L48px
L54px
L62px
L71px
왜 앨리어싱이 생기나? 텍스처가 화면에 훨씬 작게 그려지면(축소, minification) 한 픽셀이 여러 텍셀을 덮습니다. 포인트 샘플링은 그 중 단 하나만 골라 줄무늬를 놓치므로 모아레·앨리어싱이 나타납니다. 밉맵 = 미리 여러 해상도로 박스 필터 평균을 내 둔 이미지 피라미드. 조회 시 축소 비율에 맞는 레벨을 선택(가까운 두 레벨 사이 보간 = trilinear filtering)해 앨리어싱 없이 부드럽게 표현합니다.

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′ 로 계산됩니다. 씬을 드래그해서 돌려 보고, 표면을 기울여도 오른쪽 "저장값"은 그대로인 걸 확인하세요.

탄젠트 공간 저장값
TB
t=0.40
b=0.18
n=0.90
표면을 돌려도 이 값(=텍스처의 RGB)은 고정.
노멀맵 RGB
179, 150, 242
N′·L = 1.00 (음영)
18°
-12°
0.45
0.20
40°
T 탄젠트
B 바이탄젠트
N 기하 노멀
N′ 교란된 월드 노멀
L 광원
TBN 행렬이 하는 일 — 저장값 (t, b, n) 을 기저로 펴는 것뿐: N′ = t·T + b·B + n·N. 즉 열이 T, B, N 인 행렬이고, 탄젠트 공간 → 월드 공간으로 노멀을 옮깁니다. 표면을 기울이면 월드의 N′ 은 따라 도는데 오른쪽 저장값은 그대로입니다.
왜 탄젠트 공간 / 왜 푸른가 — 저장값이 표면 방향과 무관하므로 같은 노멀맵을 어떤 면·어떤 자세에도 재사용할 수 있습니다. 평평한 부분은 저장 노멀이 (0, 0, 1)=+N → RGB (128, 128, 255) 라서 노멀맵 전체가 푸르스름합니다. 두 "저장 노멀" 슬라이더를 0으로 두면 위 칩이 그 파란색이 됩니다.

5.2 Bump Map

노멀맵과 비슷하지만 흑백 높이맵(height map) 으로 상대 높이를 저장(검정=최소, 흰색=최대) → 이를 노멀로 변환해 사용.

5.3 Normal/Bump 의 한계

실제 정점을 바꾸지 않습니다. 조명만 속이므로 실루엣(윤곽선)은 여전히 평평 — 가장자리에서 들통남.

5.4 Displacement Map ⭐️

높이맵 정보로 실제 정점을 변위(offset) 시킴 → 올바른 실루엣과 self-shadowing. (대신 진짜 기하가 늘어남.)

Bump/NormalDisplacement
정점 변경❌ (조명만 속임)✅ (실제 이동)
실루엣평평(틀림)정확

5.5 Baking

비싼 계산을 오프라인으로 미리 수행해 텍스처(또는 정점 속성)에 캐싱. 고폴리(78,642 삼각형)의 디테일을 저폴리(768 삼각형)용 노멀맵으로 구워(bake) 넣는 식. 라이트맵·노멀맵·LOD 생성에 사용.

5.6 Environment Mapping ⭐️

주변 환경 이미지를 텍스처로 담아 반짝이는 물체의 반사/굴절을 "해킹". 보통 큐브 매핑(cube map) 으로 구현(360 카메라로 캡처, 구로도 가능).


📝 Knowledge Check: 텍스처 매핑

Quiz

Texture Mapping

Q 1 / 9

텍스처 매핑의 근본 목적은?


🔗 다음 학습