본문 바로가기

Library/Computer Graphics

텍스처 매핑(Texture Mapping)

어떤 물체를 가상의 3D 공간에서 폴리곤(polygon)을 사용하여 완전하게 재현하려면 엄청난 수의 폴리곤이 필요하다. 물체는 평평한 면으로만 구성된 것이 아니며, 이런 물체의 질감을 사실적으로 표현하려면 물체의 요철을 모두 묘사해야 하기 때문이다. 그러나, 현실적으로 엄청난 수의 폴리곤을 실시간으로 처리하는 것은 아무리 좋은 하드웨어라고 해도 성능상의 문제가 있다(테셀레이터는 이 주제를 다룬다). 따라서, 적정 수의 폴리곤을 사용하면서 사실적인 영상을 만들어내는 방법이 필요한데, 그 중 하나가 텍스처(texture)를 사용하는 것이다. 텍스처 처리란, 간단히 말해 물체의 표면의 속성을 모델링하는 기법 중 하나라고 할 수 있다.

즉, 물체의 질감이나 기타 효과를 표현하기 위해 폴리곤을 증가시키는 것이 아니라, 이미 원하는 효과가 표현된 2D 이미지를 평평한 폴리곤 면에 입힘으로써 극적으로 사실성을 증가시킬 수 있다. 현실적으로도 관찰자가 물체를 아주 가까이서 관찰하지 않는다면 물체의 실제 질감을 파악할 수 없기 때문에, 텍스처를 사용하여 이런 유사 효과를 내는 것은 아주 매력적인 방법이다. 물론, 텍스처의 대상이 꼭 2D 이미지로만 제한되는 것은 아니다.

텍스처 처리 과정에서 가장 중요한 문제는 투영(projection)이다. 즉, 3차원 공간 좌표로 정의된 값을 어떻게 텍스처 좌표계와 대응시키느냐 하는 문제인데, 이 투영 함수는 물체에 텍스처가 입혀지는 방식을 좌우한다. 또, 실제 텍스처 이미지에 접근하는 과정에서 매핑(mapping) 방식의 차이로 인해 선택적인 샘플링이 사용되며, 원하는 효과를 내기 위해 여러가지 보정 방법이 사용되기도 한다. 텍스처를 처리하는 일반적인 파이프라인이 있긴 하지만 그래픽 시스템이 이 과정 전체를 하드웨어로 지원하는 것이 아니며, 실제 그래픽 시스템마다 텍스처를 처리하는 방법이 조금씩 다르기 때문에 텍스처 처리는 쉬운 주제는 아니다. 일반적인 텍스처 처리 파이프라인은 다음과 같다.


1. 물체의 공간 좌표를 계산한다.
2. 매핑 공간을 (u, v)와 같은 매개변수로 표현할 수 있도록 투영 함수를 사용한다.
3. 원하는 텍스처 픽셀(텍셀, texel)을 찾기 위해 대응자 함수를 사용한다.
4. 텍셀에 접근하여 텍셀의 화소값(pixel value)을 얻는다.
5. 필요하다면 수식이나 단편값을 이용하여 화소값을 보정한다.


위의 텍스처 파이프라인을 설명하기 전에, 매핑 방향에 대해서 이야기를 해보자. 물체가 존재하고, 텍스처가 준비되었을 때 물체의 위치 정보에서 텍스처 값을 추론하는 것이 좋은가, 텍스처에서 물체의 위치 정보를 추론하는 것이 좋은가? 텍셀 좌표에서 물체의 공간 좌표로의 매핑을 정방향 매핑(forward mapping), 반대로 물체의 공간 좌표에서 텍셀 좌표로의 매핑을 역방향 매핑(reverse mapping)이라고 하는데, 텍셀이 물체의 어디에 매핑되어야 하는 것을 결정하는 것보다, 물체의 특정 공간 좌표가 어느 텍셀에 해당하는지를 결정하는게 훨씬 사실적이고 쉽다.

사실, 단일 폴리곤에 대해서만 텍스처를 입힌다고 생각하면 그냥 간단히 폴리곤의 정점이 텍스처의 어디에 해당하는지를 판단하여 텍셀에 대한 샘플링을 수행하면 된다. 하지만, 텍스처를 입히고자 하는 대상이 단일한 폴리곤으로 구성된 것이 아닌, 복잡한 곡면이라면 이런 단순한 전략을 사용할 수 없다.  여러개의 폴리곤이 곡면을 이룬 대상에 대해 텍스처를 입히려고 한다면, 먼저 이 곡면 전체에 대해 실제 텍셀 좌표로 변환할 수 있는 공간으로 변환이 이루어져야 한다. 즉, 공간 좌표 (x, y, z)의 하나의 값을 무시할 수 있는 상황이 아니라면(대상이 평면에서만 그려질 수 없다면), 이 공간 좌표를 실제 텍셀 좌표로 사용하는 것은 명백하게 불가능하기 때문이다.

즉, 투영 함수를 사용한다는 것은, 공간 좌표 값을 텍셀 좌표로 변환할 수 있는 어떤 다른 공간으로 투영한다는 뜻이다. 공간 좌표 (x, y, z)를 다른 매개변수(parameter)를 사용하여 다른 공간의 좌표값으로 표현할 수 있고, 또 사용되는 매개 변수를 줄일 수 있다면 이 공간에서 텍셀 좌표로의 매핑은 보다 간단할 것이다. 이렇게 매개 변수를 사용하여 나타낸 공간을 매개변수 공간이라 하는데, 이 매개변수 공간은 다양하게 선택될 수 있다. 만약 매개변수 (u, v)를 사용하는 원구 좌표계를 사용한다면 공간 좌표(x, y, z)와의 상관 관계는 다음과 같으며,

x = r * sin(v) * sin(u)
y = r * sin(v) * cos(u)
z = r * cos(v)

물체의 모든 공간 좌표 (x, y, z)는 구 위로 투영된다. 그리고, 이 (u, v)로 구성된 매개 변수 공간과 텍스처 좌표계와의 상관 관계를 정의할 수 있다면, 실제 텍셀 좌표값들은 구 위의 각각의 값들과 대응 관계를 이루며, 물체는 이 값을 읽어서 자신의 공간 좌표 (x, y, z)에 원하는 픽셀값을 출력할 수 있게 된다. 위의 매개변수 공간은 사실 u, v, r, 세 개의 매개변수가 필요하지만 r이 일정한 크기라면 이를 무시할 수 있다(특히 1인 경우가 많다). 텍스처 매핑이란, 극단적으로 말해 결국 물체의 공간 좌표 (x, y, z)에 출력할 화소값을 결정하는 문제이다.

매개변수 공간은 다양하게 정의될 수 있는데, 구면 투영, 원통면 투영, 평면 투영, 자유 투영 등 여러가지 방식이 있을 수 있으며, 보다 사실적인 영상을 위해 하나의 물체를 여러개로 분할하여 서로 다른 투영 함수를 적용할 수도 있다.

이제 남은 것은 매개변수 공간과 실제 텍스처와의 상관 관계이다. 위의 텍스처 파이프라인에서 3번에 해당하는 과정인데, 이 대응 관계에 의해 매개변수 공간값에서 실제 텍셀의 좌표값으로 변환된다. 이 매핑 함수를 대응자 함수(correspond function)라 한다. 매개변수 공간의 좌표값과 텍셀의 좌표값 사이에 대응 관계가 정의되면 이 관계에 따라 각각의 매개변수 공간 좌표는 실제 텍셀로 접근이 가능하고, 텍셀의 화소값을 읽는게 가능해진다. 이것이 위의 파이프라인에서의 4번 과정이다. 그러나, 대응자 함수에 의해 얻어진 텍셀의 화소값이 곧바로 물체의 공간 좌표 (x, y, z)에 입혀질 궁극적인 값이 되는 것은 아니다. 보다 좋은 품질의 이미지를 얻기 위해서 주변 텍셀의 화소값을 고려하여 보정될 수도 있고, 다른 효과를 위해 추가적인 변환을 가할 수 있기 때문이다(DX의 샘플러가 영향을 미치는 것은 바로 이 부분이다). 이 과정은 텍스처 파이프라인 처리의 마지막 단계에 해당한다.


실제 그래픽 시스템들은 효율성을 위해 자신만의 독특한 방법을 사용하기도 하고, 위의 처리 과정과 조금 다른 모습을 보이기도 한다. 하지만, 텍스처 처리가 이루어지는 일반적인 과정은 위와 같으며, 이 과정의 일부가 통합되거나 효율성을 위해 생략되기도 한다.