[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 8. 이미지 텍스처링
텍스처 좌표와 표면 파라미터화부터 텍스처 포장 모드, 확대·축소 필터링, 밉매핑까지 정리했습니다.
개요
래스터라이저가 출력하는 프래그먼트별 애트리뷰트는 대체로 노멀과 텍스처 좌표를 포함한다. 프래그먼트 쉐이더는 이들을 이용해 프래그먼트의 색상을 계산한다. 최종 영상의 품질에 결정적인 역할을 하는 프래그먼트 쉐이더는 다종다양한 알고리즘을 구현하는데, 이는 크게 라이팅(lighting)과 텍스처링(texturing)으로 구분된다. 이 장은 텍스처링을, 다음 장은 라이팅을 다룬다.
8.1 텍스처 좌표
그림 8.1. 이미지 텍스처링 (a) 이미지 텍스처는 텍셀들의 배열이다. (b) 텍스처가 물체 표면에 입혀졌다.
일반적으로 텍스처는 배열 구조를 가지는데, 이 배열이 색상 정보를 저장하고 있다면 이를 이미지 텍스처(image texture)라 부른다(색상이 아닌 정보를 저장하는 텍스처는 이 책의 2부에서 다룬다). 텍스처는 텍셀(texel; texture element)로 구성된다. 이미지 텍스처의 텍셀은 픽셀 (pixel; picture element)과 동일한 것이지만 구분상 편의를 위해 이름을 따로 붙였다. 각 텍셀의 위치는 그 중심의 2차원 좌표로 표현할 수 있는데, 그림 8.1.a에서 왼쪽 아래 모퉁이 텍셀의 좌표는 (0.5, 0.5), 그 오른쪽 텍셀의 좌표는 (1.5, 0.5)이다.
텍스처링은 물체 표면에 벽지 바르듯이 텍스처를 입히는 것으로 이해하면 된다. 그림 8.1.a의 이미지가 원통면에 입혀진 것이 그림 8.1.b이다. 이를 위해서는 원통면 폴리곤 메시의 각 정점마다 텍스처 좌표(texture coordinates)를 할당해야 한다. 이는 오프라인 모델링 단계에서 이뤄지는데, 8.2절에서 설명할 것이다.
그림 8.2. 스캔 전환과 텍스처링. (a) 스캔 전환 단계에서 각 프래그먼트마다 텍스처 좌표가 계산된다. (b) 정규화된 파라미터 공간에서의 텍스처 좌표. (c) 텍스처 좌표가 실제 텍스처 공간으로 투영되었다.
2차원 텍스처 좌표는 보통 (s,t) 혹은 (u,v)로 표현하는데, 각 좌표는 원칙적으로 [0, 1] 범위 안에 정규화되어 있다. 그림 8.2.a의 스크린 공간 삼각형을 보자. 세 정점에 각각 (0, 0), (1, 0), (0, 1)의 텍스처 좌표가 주어졌다. 7.5절에서 소개한 스캔 전환 알고리즘은 먼저 변을 따라, 그 다음에 스캔라인을 따라 이들 텍스처 좌표를 보간한다. 스캔 전환이 완료되면 각각의 프래그먼트는 보간된 (s,t) 좌표를 가지게 된다. 예를 들어, 그림 8.2.a 왼쪽 아래 끝 프래그먼트는 (1/8, 1/8)의 좌표를 가진다. 그림 8.2.b는 s축과 t축 방향 모두 정규화된 파라미터 공간에서 (1/8, 1/8)의 상대적인 위치를 보여준다.
해상도가 $r_x X r_y$인 텍스처가 주어졌을 때, 정규화된 텍스처 좌표 (s,t)는 아래와 같은 방식으로 실제 텍스처 공간으로 매핑된다.
\[\begin{aligned} s^{'} = s \times r_x \\ t^{'} = t \times r_y \\ \end{aligned} \tag{8.1}\]이를 가리켜, 텍스처 좌표 (s,t)가 텍스처 공간의 (s’,t’)로 투영되었다고 표현한다. 그림 8.2.c의 간단한 텍스처의 경우 $r_x = r_y = 4$인데, 식 (8.1)에 따라 텍스처 좌표 (1/8, 1/8)은 텍스처 공간의 (0.5, 0.5)로 투영되고, (0.5, 0.5) 좌표를 가진 왼쪽 아래 모퉁이 텍셀을 읽어오게 된다. 이 텍셀의 RGB 값이 그림 8.2.a 왼쪽 아래 끝 프래그먼트의 색상 결정에 사용된다.
_그림 8.4. 정규화된 텍스처 좌표를 이용한 텍스처링. (a) 원통면 메시의 각 정점마다 텍스처 좌표가 할당되었다(이 그림에서는 일부 정점의 텍스처 좌표만 표시하였다). (b) 원통면에 텍스처를 입혔다. 텍스처링 결과에 일부러 폴리곤 메시를 겹치게 그렸는데, 실제 결과는 그림 8.1.b와 같을 것이다. (c) (a)에 보인 텍스처 좌표를 그대로 사용하면서 원통면에 다른 텍스처를 입혔다.
폴리곤 메시 정점들에 정규화된 텍스처 좌표를 할당하면, 상이한 해상도를 가진 여러 개의 텍스처를 사용할 수 있다. 그림 8.3에서 텍스처 좌표 (0.5, 0.5)는 어느 텍스처를 사용하건 그 텍스처의 정중앙을 의미하는데, texture1에서는 (2.5, 2.5)로, texture2에서는 (3.5, 3.5)로 투영된다. 그림 8.4를 보면, 원통면 폴리곤 메시의 텍스처 좌표 변경 없이도 상이한 해상도를 가진 두 개의 텍스처를 사용할 수 있음을 알 수 있다.
그림 8.2와 8.3에서는 식 (8.1)로 계산된 (s’, t’)가 항상 텍셀 한가운데로 투영되었는데, 사실 이런 경우는 거의 없고 텍스처 공간 내 임의의 위치로 투영된다. 8.5절은 이러한 (s’, t’)를 처리하는 방법을 설명한다.
한편, 텍스처는 2차원으로 국한되지 않는다. 예를 들어, X-레이 영상 한 장은 2차원 텍스처로 볼 수 있는데, CT와 MRI 등과 같이 층층이 쌓인 영상은 3차원 텍스처에 해당한다. 이를 볼륨 텍스처라고 부르는데, 의료 영상 가시화에 널리 쓰이고, GL 역시 이와 같은 3차원 텍스처링을 지원한다. 하지만, 컴퓨터 그래픽스에서는 2차원 텍스처가 압도적으로 많이 쓰이므로, 이 책은 2차원 텍스처링만 다룰 것이다.
8.2 표면 파라미터화
폴리곤 메시의 각 정점에 텍스처 좌표 (s,t)를 할당하는 작업을 표면 파라미터화(surface parameterization) 혹은 단순히 파라미터화라고 부른다. 이 작업을 위해서는 3차원 메시를 2차원 평면에 펼쳐야 한다. 그림 8.5.a에 보인 원통과 같은 경우는 쉽게 평면에 펼쳐진다. 개념적으로 설명하면, 원통 표면을 수직으로 자르고 옆으로 눌러 펼치면 된다. 이렇게 펼쳐진 2차원 직사각형 메시를 [0, 1]의 범위를 가지는 st 파라미터 공간에 매핑하면 각 정점에 (s, t) 텍스처 좌표가 할당된다. 이는 정점 배열에 기록되어 정점 쉐이더에게 전달된다.
그림 8.5.a. 표면 파라미터화. 원통과 같이 전개 가능한 곡면은 파라미터화가 쉽다. 이 그림에서는 일부 정점의 텍스처 좌표만 표시하였다.
그림 8.5.b. 표면 파라미터화. 대부분의 3차원 물체는 파라미터화 과정에서 왜곡 현상을 피할 수 없으나 이를 최소화하는 좋은 알고리즘들이 존재한다.
하지만 3차원 폴리곤 메시를 2차원 평면으로 펼치는 과정에서는 대부분 왜곡 현상이 발생한다. 예를 들어, 3차원 메시를 구성하는 폴리곤들의 면적 비율이 2차원 평면에서는 그대로 보존되지 않는다(원통이나 원뿔 등은 왜곡을 피할 수 있는데 이는 예외적인 경우이다). 그런데, 이러한 왜곡을 최소화하는 많은 파라미터화 기술이 컴퓨터 그래픽스 분야에서 꾸준히 연구개발되어 왔다. 3ds Max와 같은 그래픽스 패키지에서는 반자동적인 방법에 기반한 파라미터화 도구를 제공한다.
그림 8.6. 차트와 아틀라스 (a) 얼굴 패치에 대한 차트. 펼쳐진 패치를 일부러 차트 위에 겹쳐 보였다. (b) 여러 차트를 하나의 텍스처에 모은 것을 아틀라스라 한다.
복잡한 폴리곤 메시는 여러 개의 패치(patch)로 나눠져 각각 파라미터화된다. 그림 8.5.b는 캐릭터 머리 부분 패치를 파라미터화한 결과를 보여준다. 그래픽 디자이너는 파라미터화가 완료된 2차원 패치에 포토샵 등을 이용하여 이미지를 그린다. 이 이미지를 차트(chart)라고 부른다. 그림 8.6.a는 캐릭터 머리 위에 입혀질 차트를 보여준다. 대개의 경우, 효율적인 렌더링을 위해 여러 차트를 하나의 커다란 텍스처에 모은다. 이를 아틀라스(atlas) 라고 부른다. 그림 8.6.b는 아구선수 모델의 몸 전체에 입혀질 아틀라스를 보여준다.
8.3. GL에서의 텍스처 정의
예제 코드 8-1. 텍스처 오브젝트를 위한 GL 프로그램
텍스처 하나가 GL 프로그램에 로드되어서 예제 코드 8.1의 texData를 채웠다고 가정하자. 여기에서 texels는 실제 텍셀들을 가리키고 width x height는 텍스처 해상도를 말한다. 예제 코드 6.5에서는 정점 배열의 버퍼 오브젝트 생성을 위해 glGenBuffers, glBindBuffer, glBufferData를 차례차례 호출했는데, 텍스처도 이와 유사한 방식으로 처리된다.
- 텍스처 오브젝트(texture object) 생성을 위해 glGenTextures(GLsizei n, GLuint* textures)를 호출한다. glBindTextures의 첫 번째 파라미터는 2차원 텍스처를 의미하는 GL_Texture_2D이고, 두 번째 파라미터는 glGenTextures가 생성한 텍스처 오브젝트의 ID(예제 코드 8-1에서는 texture)이다.
- 텍스처 오브젝트를 실제 텍스처로 채우기 위하여 glTexImage2D를 호출한다.
예제 코드 8-1에서, glTexImage2D를 호출할 때 텍스처 오브젝트 ID(texture)를 파라미터로 사용하지 않았음에 유의하자. 실제로, glTexImage2D는 텍스처 오브젝트 ID를 필요로 하지 않는다. 일단 텍스처 오브젝트가 바인딩되면, 그 이후에 호출되는 함수들은 기본적으로 바인딩된 텍스처 오브젝트를 사용하게 되어 있다.
8.4. 텍스처 포장
텍스처 좌표는 원칙적으로 [0, 1] 범위 안에서 정의되지만, GL은 그 범위 밖에서 좌표를 지정하는 것을 허용하고 이를 처리해 준다. 사용자는 이른바 텍스처 포장 모드(texture wrapping mode)를 설정하여 그 처리 방식을 조절할 수 있다. 그림 8.7.a의 이미지 텍스처가 그림 8.7.b의 폴리곤 메시에 입혀지는 경우를 생각해 보자. 폴리곤 메시의 세 정점은 [0, 1] 범위 밖의 텍스처 좌표를 가지고 있다. 이에 따라 래스터라이저가 생성하는 프래그먼트의 상당수는 [0, 1] 범위 밖의 텍스처 좌표를 가지게 된다. 이러한 텍스처 좌표는 [0, 1] 범위의 경계(edge)로 고정(clamp)시킬 수 있다. 이를 경계 고정 모드(clamped-to-edge)라 하는데, 예를 들어, 한 프래그먼트의 s 값이 1.1이라면 이를 경계 값인 1.0으로 바꾸는 것이다. 그림 8.7.c는 경계 고정 모드로 처리된 결과를 보여주는데 썩 만족스럽지 않다.
그림 8.7. 텍스처 포장 모드. (a) 텍스처. (b) [0,1] 범위를 벗어난 텍스처 좌표. (c) 경계 고정 모드. (d) 반복 모드. (e) 반사 반복 모드. (f) 반복 모드 + 반사 반복 모드.
한편 [0, 1] 범위를 벗어나는 텍스처 좌표가 주어지면 그 소수점 이하만 이용할 수도 있다. 예를 들어, s값이 1.1이라면 이를 0.1로 대체한다. 이렇게 하면 그림 8.7.d에 보인 것처럼 텍스처 좌표가 정수가 되는 지점에서 텍스처를 타일처럼 이어붙인 결과가 나온다. 이를 반복 모드(repeat mode)라 부르는데, 작은 이미지로 넓은 영역을 텍스처링할 수 있으므로 경계 고정 모드보다 훨씬 많이 사용된다. 하지만, 텍스처 타일 사이의 경계선이 두드러져 보일 수 있다는 단점도 가진다. 이를 극복하기 위해 반사 반복 모드(mirrored-repeat mode)를 사용할 수 있다. 예를 들어, s값이 1.1이라면 이를 0.9로 바꾸고, s값이 1.2라면 0.8로 바꾼다. 이렇게 하면, 텍스처 타일은 정수의 텍스처 좌표마다 반사된 형태로 놓이게 되어 그림 8.7.e와 같은 부드러운 결과를 얻을 수 있다. 한편, s축과 t축을 따라 서로 다른 모드를 사용할 수 있는데, 그림 8.7.f는 s축을 따라서는 반복 모드를, t축을 따라서는 반사 반복 모드를 적용한 결과를 보여준다.
GL에서 텍스처 포장 모드는 glTexParameteri를 이용하여 지정된다. 예를 들어 그림 8.7.f는 아래와 같은 glTexParameteri 호출을 통해 얻어진다.
8.5 텍스처 필터링
그림 8.8. 텍스처 확대 및 축소. (a) 폴리곤 메시. (b) 이미지 텍스처.
그림 8.8. 계속. (c) 텍스처 확대의 경우, 텍스처 공간에 투영된 픽셀이 텍셀보다 많다.
그림 8.8 계속. (d) 텍스처 축소의 경우, 픽셀이 텍셀보다 적다.
프래그먼트의 텍스처 좌표 (s,t)는 식 (8.1)에 의해 텍스처 공간의 (s’, t’)로 투영된다. 그러면, (s’, t’) 주변의 텍셀을 고려해서 해당 프래그먼트의 색상을 결정해야 하는데, 이를 텍스처 필터링이라고 부른다.
그림 8.8.a의 사각형에 그림 8.8.b의 이미지를 텍스처링하는 경우를 생각해보자. 카메라 파라미터, 뷰 프러스텀 파라미터, 뷰포트 파라미터 등이 어떻게 설정되느냐에 따라 스크린 공간에서의 사각형의 크기는 달라진다. 텍스처는 사각형에 맞도록 확대(magnify)되어야 한다. 그림 오른쪽에 점선 격자로 그려진 것은 텍스처 공간을 나타내는데, 격자 한 칸에 텍셀이 하나씩 위치한다. 한편, 동그란 점은 텍스처 공간에 투영된 픽셀을 나타낸다(엄밀히 말하면, 픽셀 대신 프래그먼트라고 불러야 하는데, 텍셀과 비교하려는 목적으로 당분간 이들을 픽셀이라고 부를 것이다). 텍셀보다 픽셀이 많음에 주목하자.
반면, 그림 8.8.d의 경우, 스크린 공간 사각형의 크기는 이미지 텍스처보다 작다. 따라서, 텍스처는 사각형에 맞도록 축소(minify)되어야 한다. 텍셀보다 픽셀이 적으므로, 그림 오른쪽에 보인 것처럼, 픽셀들은 텍스처 공간에 듬성듬성 투영된다.
8.5.1 텍스처 확대
텍스처 확대에 사용되는 필터링 방법 중 하나는 근접점 샘플링(nearest point sampling)이다. 즉, (s’, t’)와 가장 가까운 텍셀을 사용하는 것이다. 이렇게 하면, 그림 8.9.a 왼쪽에 보인 것처럼, 여러 개의 픽셀이 하나의 텍셀을 참조하게 되어, 그림 오른쪽에 보인 것처럼 마치 모자이크 처리된 듯한 결과를 얻게 된다. 어린아이 머리와 배경 간 경계에서 이는 두드러진다. 텍스처 확대의 경우, 근접점 샘플링 기법은 만족스러운 결과를 생성하지 못한다.
보다 나은 필터링 기법은 겹선형보간(bilinear interpolation)인데, (s’, t’) 주위를 둘러싸는 네 개의 텍셀을 겹선형보간하여 해당 픽셀의 텍스처 색상을 결정하는 방법이다. 그림 8.9.b 왼쪽 아래 식을 보자. 겹선형보간을 사용하면 인접한 픽셀일지라도 필터링된 색상이 달라질 수 있고, 이에 따라 근접점 샘플링보다 부드러운 텍스처링 결과를 얻을 수 있다. 대부분의 경우에 겹선형보간 기법은 근접점 샘플링보다 우수한 결과를 생성한다.
그림 8.9.a. 텍스처 확대를 위한 필터링. 투영된 픽셀에 가장 가까운 텍셀에서 색상을 가져온다.
그림 8.9.b. 텍스처 확대를 위한 필터링(계속). 투영된 픽셀을 둘러싼 네 개 텍셀의 색상 $c_i$를 겹선형보간한다.
8.5.2. 텍스처 축소
그림 8.10. 텍스처 축소에서의 에일리어싱 문제. (a) 모든 픽셀이 검은색 텍셀에 둘러싸이게 되면 텍스처링 결과는 검은색으로 나타난다. (b) 모든 픽셀이 회색 텍셀에 둘러싸이게 되면 텍스처링 결과는 회색으로 나타난다.
그림 8.10.a의 왼쪽에 그려진 격자 무늬 이미지 텍스처에는 검은색 텍셀 두 줄이 4x4 크기의 회색 텍셀들을 가로 세로로 둘러싸고 있다. 텍스처 축소의 경우, 픽셀들이 텍스처 공간에 듬성듬성 투영됨을 기억하자. 그림 8.10.a에 동그란 점으로 그려진 네 개의 픽셀은 모두 검은색 텍셀에 둘러싸여 있다. 이러한 경우, 필터링 기법으로 근접점 샘플링을 택하건 겹선형보간을 택하건 관계없이 픽셀의 텍스처 색상은 검은색이 된다. 만약 스크린 공간 프리미티브의 모든 픽셀들이 이렇게 검은색 텍셀에 둘러싸이게 되면, 텍스처링된 프리미티브는 완벽한 검은색이 된다. 즉, 격자 무늬의 이미지가 제대로 텍스처링되지 않는다. 반면, 그림 8.10.b에 보인 바와 같이 텍스처 공간에 투영된 픽셀이 모두 회색 텍셀에 둘러싸이게 되면 픽셀의 텍스처 색상은 회색이 된다.
이 문제는 이른바 에일리어싱(aliasing)의 한 예이다. 에일리어싱은 고주파 신호(우리 예에서는, 그림 8.10의 격자 무늬 이미지 텍스처)를 낮은 빈도로 샘플링(우리 예에서는, 듬성듬성 투영된 텍스처 필터링)할 때에 발생하는 오류를 의미한다. 에일리어싱은 신호 처리와 컴퓨터 그래픽스 분야에서 아주 빈번하게 부딪히는 문제이다. 에일리어싱이 일으키는 부작용을 최소화하기 위한 앤티에일리어싱(anti-aliasing) 기술이 필요한데, 이제부터는 텍스처링 분야에서 사용되는 대표적인 앤티에일리어싱 기법을 소개할 것이다.
8.6. 밉매핑
텍스처 축소 시 발견한 에일리어싱의 원인을 한 마디로 요약하면, 픽셀에 비해 텍셀이 너무 많아서 텍스처링에 참여하지 못하는 텍셀이 발생하기 때문이다. 그렇다면 문제 해결 방법은 간단하다. 텍스처를 작게 만들어서 텍셀 수를 픽셀 수에 맞추면 된다.
8.6.1. 밉맵 생성
그림 8.11.a 왼편 끝에 있는 원본 텍스처는 8x8 해상도를 가졌다. 이 원본 텍스처를 구성하는 2x2 텍셀들의 색상 평균을 구하는 작업을 반복하면, 원본 텍스처의 1/4 크기를 가진 4x4 해상도 텍스처를 만들 수 있다. 이러한 다운샘플링(down-sampling)을 반복하면 원본 텍스처 전체의 평균 색상을 담고 있는 1x1 크기의 텍스처를 얻을 수 있다.
그림 8.11 밉맵 생성 (a) 2x2 텍셀들을 하나의 텍셀로 결합하는 과정을 반복한다. (b) 원본 텍스처가 $2^l$x$2^l$의 해상도를 가지는 경우, 총 (l + 1) 레벨을 가진 텍스처 피라미드가 얻어진다.
원본 텍스처의 해상도가 $2^l$x$2^l$일 때, 다운샘플링을 통해 우리는 l개의 텍스처를 새로 만들 수 있다. 원본 및 다운샘플된 텍스처들은 그림 8.11.b와 같이 총 (l + 1)개의 레벨을 가지는 텍스처 피라미드로 묶일 수 있다. 원본 텍스처는 0번 레벨에 위치한다. 이 피라미드를 밉맵(mipmap)이라 부른다. 접두어 mip은 라틴어 ‘multum in parvo’의 약자로 ‘작은 공간 안에 있는 많은 것들’을 의미한다. 이러한 밉맵을 사용하면, 텍셀 개수를 픽셀 개수에 맞출 수 있다.
8.6.2. 밉맵 필터링
이제부터 밉맵이 어떻게 필터링되는지 살펴볼 텐데, 이해를 돕기 위하여 다소 작위적인 예제를 사용할 것이다. 그림 8.12.a는 텍스처 축소의 경우를 보여주는데, 0번 레벨의 텍스처 즉 원본 텍스처가 스크린 공간 사각형의 네 배의 크기를 가진다. 그림 8.12.b의 왼쪽은 0번 레벨 텍스처의 일부를 구성하는 64개의 텍셀을 보여주는데, 이 영역으로 16개의 픽셀이 투영되었다.
이제까지 우리는 픽셀을 스크린 공간의 한 점으로 간주해 왔고, 이 픽셀이 텍스처 공간의 한 점인 (s’, t’)로 투영된다고 설명해 왔다. 하지만 실제로 픽셀은 스크린 공간의 작은 영역을 덮고 있다. 이 영역이 정사각형이라고 가정하면, 정사각형 픽셀들이 전체 스크린을 타일처럼 뒤덮고 있는 것으로 생각할 수 있다. 따라서 텍스처 공간에 투영된 픽셀은 (s’, t’)에 놓인 점이 아니라 (s’, t’)을 중심으로 일정한 영역을 차지하게 된다. 이 영역을 픽셀의 발자국이라고 부른다. 그림 8.12.b의 0번 레벨 텍스처 오른쪽 아래 구석에 보인 것처럼 픽셀 발자국은 2x2 텍셀 영역을 차지한다. 텍셀이 픽셀보다 너무 많다.
그림 8.12.a 밉맵 필터링 예제 1. 스크린 공간 사각형과 1번 레벨 텍스처의 크기가 같다.
그림 8.12.b 밉맵 필터리 예제 1. 픽셀 발자국은 0번 레벨 텍스처에서는 네 개의 텍셀을 차지하지만 1번 레벨 텍스처에서는 하나의 텍셀을 차지한다.
그러면 텍스처 피라미드에서 한 레벨 위로 올라가 보자. 그림 8.12.b에서 확인할 수 있는 것처럼, 1번 레벨에서 픽셀 발자국은 하나의 텍셀을 차지한다. 즉, 픽셀과 텍셀의 개수가 같다. 그러면 이 레벨에서 필터링이 수행된다(이 예에서는 픽셀의 중심이 텍셀의 중심과 일치하므로 근접점 샘플링과 겹선형보간 기법 모두 동일한 결과를 산출한다).
그림 8.13.a의 예에서 0번 레벨의 텍스처 즉 원본 텍스처는 스크린 공간 사각형의 16배의 크기를 가진다. 그림 8.13.b는 픽셀 발자국이 0번, 1번, 2번 레벨 텍스처에서 각각 4x4, 2x2, 1x1 텍셀들을 차지함을 보여준다. 따라서, 픽셀과 텍셀의 개수가 같은 2번 레벨을 선택할 것이다.
그림 8.13. 밉맵 필터링 예제 2. (a) 스크린 공간 사각형과 2번 레벨 텍스처의 크기가 같다. (b) 픽셀 발자국은 2번 레벨 텍스처에서 하나의 텍셀을 차지한다.
밉맵 0번 레벨에 있는 원본 텍스처의 RGB 값은 그 상위 레벨에 모두 포함(평균 속에 녹아 있다가 더 정확한 표현일 거 같다) 되어 있다. 따라서, 밉맵의 어느 레벨을 골라 필터링을 하건, 원본 텍스처의 텍셀이 배제되는 경우는 없다. 이렇게 해서 에일리어싱 문제를 해결하는 것이다.
필터링을 수행할 밉맵의 레벨을 통상적으로 $\lambda$로 표기하는데, 픽셀의 발자국이 0번 레벨 텍스처에서 m x m 텍셀을 차지하는 경우 $\lambda$는 $log_2m$으로 설정된다. m이 2의 거듭제곱이라면 $\lambda$는 정수가 된다. 그림 8.12의 경우, m = 2^1이므로 $\lambda$는 1이 된다. 그림 8.13의 경우, m = 2^2이므로 $\lambda$는 2가 된다.
하지만, 대개의 경우 m은 2의 거듭제곱이 아닐 것이다. 따라서 $\lambda$는 정수가 아닌 실수가 된다. 그림 8.14.a의 예를 보면, 픽셀 발자국은 원본 텍스처에서 3x3 텍셀들을 차지한다. 따라서 $\lambda$ = $log_23 \approx $ 1.585가 된다. 이처럼 정수 아닌 $\lambda$가 계산되면, $\lambda$에 가장 가까운 레벨을 선택할 수 있다. 이 레벨은 $\lfloor \lambda + 0.5 \rfloor$로 쉽게 확인되는데, 그림 8.14.a에서는 2번 레벨이 된다. 물론 이 레벨은 근접점 샘플링 혹은 겹선형보간을 통해 필터링될 수 있다.
그림 8.14.a 밉맵 필터링 예제 3. 스크린 공간 사각형은 1번 레벨 텍스처보다는 작고 2번 레벨 텍스처보다는 크다.
그림 8.14.b 밉맵 필터링 예제 3. 람다가 1.585로 계산되므로 1번 및 2번 레벨이 선택된다. 각 레벨은 겹선형보간 기법으로 필터링되고, 그 결과는 다시 선형보간된다.
그런데 보다 좋은 방법은 $\lfloor \lambda \rfloor$와 $\lceil \lambda \rceil$ 두 레벨을 모두 선택해서, 각 레벨을 필터링한 결과를 선형보간하는 것이다. 그림 8.14.b에서는 람다가 1.585이므로 1번과 2번 레벨을 선택하고, 두 레벨 모두 겹선형보간으로 필터링한 후, 그 결과를 람다의 소수점 이하 값 0.585를 이용해 선형보간한 결과를 보여준다. 이것을 특히 삼선형보간(trilinear interpolation)이라 부르낟.
이제까지 밉매핑을 설명하면서 정사각형 모양의 픽셀 발자국을 예로 들었다. 하지만, 대게의 경우 픽셀 발자국은 정사각형이 아니므로, 보다 복잡한 방법으로 람다가 계산된다. 그러나, 이 계산은 GPU가 전담하므로 응용 프로그래머는 신경쓰지 않아도 된다.
8.7 GL에서의 밉맵 필터링, 8.8 GL 밉매핑 예시, 8.9 텍스처링을 위한 프래그먼트 쉐이더는 생략하겠다.
참고


