10.5 텍스처 매핑 (Texture Mapping)
물체의 외관에는 모양 외에도 많은 요소가 있습니다. 물체마다 색이 다르고 표면의 무늬도 다릅니다. 이런 특성을 담는 단순하면서도 강력한 방법이 텍스처 매핑(texture mapping)입니다. 텍스처 맵(texture map)은 물체의 표면에 ‘붙이는’ 비트맵 이미지입니다.
삼각형별 또는 정점별로 색을 조절하는 대신, 텍스처 매핑으로 훨씬 더 세밀한 텍셀(texel) 단위의 색을 조절할 수 있습니다. 텍셀은 텍스처 맵의 픽셀 하나입니다. 그래픽스에서는 여러 종류의 비트맵에 접근하므로, 프레임 버퍼의 픽셀과 텍스처의 픽셀을 짧게 구별하는 이 단어를 알아두면 편리합니다.
텍스처 맵은 모델의 표면에 적용하는 평범한 비트맵입니다. 정확히 어떻게 적용할까요? 실제로 메시 위에 텍스처 맵을 놓는 방법은 다양합니다. 평면 매핑(planar mapping)은 텍스처를 메시 위에 직교 투영합니다. 구면·원통·정육면체 매핑은 텍스처로 물체를 ‘감싸는’ 여러 방법입니다. 지금은 각 기법의 세부 사항보다 핵심 개념이 중요합니다. 3DS Max 같은 모델링 도구가 이런 사용자 인터페이스 문제를 다루기 때문입니다.
핵심은 메시 표면의 각 점에서 텍스처 매핑 좌표를 얻을 수 있다는 것입니다. 이 좌표는 해당 3차원 위치에 대응하는 텍스처 맵 안의 2차원 위치를 정의합니다. 전통적으로 가로 좌표는 u, 세로 좌표는 v를 사용하므로, 텍스처 매핑 좌표를 UV 좌표 또는 간단히 UV라고 부릅니다.
비트맵의 크기는 서로 달라도 UV는 정규화합니다. 이미지의 픽셀 수와 관계없이 전체 너비(u)와 높이(v)에 각각 0에서 1까지를 대응시킵니다. 원점은 DirectX식 규약에서는 이미지 왼쪽 위, OpenGL 규약에서는 왼쪽 아래에 둡니다. 이 책은 DirectX 규약을 사용합니다. 그림 10.16은 여러 예제에 사용할 텍스처 맵과 이 좌표 규약을 보여줍니다.
그림 10.16 — 왼쪽 위를 원점으로 하는 DirectX 규약의 UV 좌표가 표시된 예제 텍스처
원칙적으로는 표면의 각 점에 대한 UV를 어떻게 정하든 상관없습니다. 그러나 아티스트가 편집하는 대신 동적으로 계산하더라도, 보통은 정점에서만 UV를 계산하거나 지정합니다. 면 안쪽의 임의 위치에서는 보간으로 UV를 얻습니다. 텍스처 맵을 잘 늘어나는 천이라고 상상해 보세요. 정점에 UV를 지정하는 것은 천의 해당 UV 위치에 핀을 꽂고, 그 핀을 표면의 정점에 고정하는 것과 같습니다. 정점마다 핀이 하나씩 있으므로 표면 전체를 덮게 됩니다.
몇 가지 예를 보겠습니다. 그림 10.17은 하나의 텍스처 사각형에서 정점에 서로 다른 UV를 지정한 결과입니다. 원본의 각 도식 아래쪽은 텍스처의 UV 공간을 보여줍니다. 충분히 살펴보고 각 결과가 어떻게 만들어지는지 이해하세요. 아래에서는 같은 원본의 위·아래 패널을 대응하는 순서로 배치했습니다.
그림 10.17 — 서로 다른 UV를 지정한 사각형
그림 10.17 첫째 — 전체 텍스처를 적용한 사각형
그림 10.17 첫째의 UV 공간
그림 10.17 둘째 — 텍스처 일부를 확대해 적용
그림 10.17 둘째의 UV 공간
그림 10.17 셋째 — UV 배치에 따른 회전
그림 10.17 셋째의 UV 공간
UV는 밖의 값도 허용하며, 실제로 꽤 유용합니다. 범위를 벗어난 좌표는 여러 방식으로 해석할 수 있습니다. 가장 흔한 주소 지정 모드(addressing mode)는 반복(repeat)과 클램프(clamp)입니다. 반복은 tile 또는 wrap이라고도 합니다. 반복 모드에서는 정수 부분을 버리고 소수 부분만 사용하여, 그림 10.18 왼쪽처럼 텍스처가 반복되게 합니다.
클램프에서는 비트맵에 접근할 때 범위 밖의 좌표를 안으로 제한합니다. 결과적으로 그림 10.18 오른쪽처럼 가장자리 픽셀이 바깥으로 길게 늘어납니다. 두 경우의 메시는 완전히 같습니다. 정점 네 개를 가진 다각형 하나이고 UV도 동일합니다. 유일한 차이는 바깥의 좌표를 해석하는 방법입니다.
그림 10.18 왼쪽 — 반복 주소 지정 모드
그림 10.18 오른쪽 — 클램프 주소 지정 모드
일부 하드웨어는 미러(mirror) 같은 다른 방법도 지원합니다. 반복과 비슷하지만 타일 하나 걸러 하나를 반전합니다. 인접 타일 사이에 ‘이음매’가 생기지 않도록 보장할 수 있어 유용합니다. 대부분의 하드웨어에서는 u와 v의 주소 지정 모드를 독립적으로 설정할 수 있습니다.
중요한 것은 이 규칙을 좌표로 텍스처를 실제 조회하는 마지막 순간에 적용한다는 점입니다. 정점의 UV 자체를 제한하거나 미리 처리하지는 않습니다. 그렇게 하면 면 전체에서 좌표를 제대로 보간할 수 없기 때문입니다.
그림 10.19는 마지막으로 살펴볼 만한 예입니다. 같은 메시에 서로 다른 두 방식으로 텍스처를 매핑했습니다. 텍스처 매핑이 사각형 하나에만 적용되는 것은 아니라는 점을 보여줍니다.
그림 10.19 왼쪽 — 첫 번째 텍스처 매핑
그림 10.19 왼쪽의 UV 공간
그림 10.19 오른쪽 — 같은 메시의 다른 텍스처 매핑
그림 10.19 오른쪽의 UV 공간
반복 처리는 보간한 뒤에
한 변의 UV가 0에서 2까지라면 면을 따라 텍스처가 두 번 반복되어야 합니다. 정점 단계에서 양끝을 모두 0으로 바꾸면 중간 UV까지 0으로 보간되어, 반복할 정보가 사라집니다. 먼저 0에서 2까지 보간하고, 각 조회 위치에서 반복 규칙을 적용해야 합니다.
음수 UV에서도 일관되게 반복하려면 ‘정수 부분을 버린다’는 원문의 직관을 다음처럼 구체화할 수 있습니다.
따라서 u=1.25와 u=−0.75는 모두 0.25로 대응합니다. 0 방향 정수 절삭을 쓰면 음수에서 결과가 달라질 수 있습니다. 클램프는 입니다.
flowchart LR A["정점 UV: 0과 2"] --> B["면 안에서 UV 보간"] B --> C["조회 시 repeat / clamp 적용"] C --> D["텍스처 색 읽기"]
Mermaid
복사

















