1. 개요[편집]
| 밉맵 Mipmap | |
|---|---|
| 어원 | 라틴어 multum in parvo (작은 것 안에 많은 것) |
| 제안 | Lance Williams (1983) |
| 목적 | 텍스처 축소 시 앨리어싱 억제 |
| 메모리 비용 | 원본 대비 약 +33% |
| 관련 | 실시간 렌더링, 레벨 오브 디테일 |
밉맵(mipmap)은 하나의 텍스처를 미리 여러 해상도로 줄여 놓은 이미지 피라미드로, 화면에서 멀리 있거나 작게 그려지는 표면에 저해상도 버전을 골라 씌워 축소 시 발생하는 앨리어싱(aliasing)을 억제하는 기법이다. 이름은 라틴어 문구 multum in parvo(“작은 공간에 많은 것”)의 머리글자 MIP에서 따왔다.1 1983년 랜스 윌리엄스(Lance Williams)가 제안한 이래, 밉맵은 GPU 텍스처 하드웨어에 아예 눌러붙어 버린 실시간 렌더링의 국룰이 되었다.
핵심 아이디어는 단순하다. 표면 한 픽셀이 텍스처의 넓은 영역을 덮어야 하는데 텍스처를 원본 해상도 그대로 점 하나만 뽑아 쓰면(point sampling), 그 넓은 영역의 정보를 단 하나의 텍셀(texel)로 대표해 버리는 셈이라 표본화 정리를 위반한다. 그 결과 멀리 있는 바닥 타일이 지글지글 끓거나(shimmering), 도로의 차선이 무아레(moiré) 무늬로 춤춘다. 밉맵은 “어차피 축소해서 평균 낼 거면 미리 평균 내 놓자”는 발상으로 이 문제를 정면 돌파한다.
2. 표본화 관점에서 본 앨리어싱[편집]
밉맵을 제대로 이해하려면 나이퀴스트-섀넌 표본화 정리의 언어로 봐야 한다. 텍스처는 공간 신호이고, 화면 픽셀은 그 신호를 표본화하는 격자다. 표면이 원거리로 밀려나면 한 픽셀에 대응하는 텍스처 영역(footprint)이 넓어지고, 신호의 유효 주파수가 픽셀 표본화율의 나이퀴스트 한계를 초과한다. 이때 고주파 성분이 저주파로 접혀 들어오는 것이 바로 앨리어싱이다.
올바른 처방은 표본화 전에 저역통과 필터로 고주파를 잘라내는 것(prefiltering)이다. 하지만 매 픽셀마다 넓은 영역을 실시간으로 적분하면 비용이 감당이 안 된다. 밉맵은 이 적분을 미리, 오프라인으로 계산해 캐싱해 둔 자료구조다. 즉 밉맵은 필터링 자체를 없애는 게 아니라, 축소 필터링의 대부분을 빌드 타임/로드 타임으로 옮겨 런타임 비용을 상수 시간으로 만든 트레이드오프다.
3. 피라미드 구성과 메모리[편집]
밉맵 레벨 0은 원본 텍스처다. 각 상위 레벨은 바로 아래 레벨을 가로세로 절반으로 줄인 것으로, 보통 인접한 2×2 텍셀 4개를 평균(box filter)해 만든다. 텍스처라면 레벨은 개가 생긴다.
메모리 오버헤드는 등비급수로 딱 떨어진다. 2D 텍스처에서 각 레벨은 이전의 1/4 크기이므로 총량은
즉 원본 대비 약 33% 추가로 전체 피라미드를 저장한다.2 축소로 인한 텍스처 캐시 적중률 향상까지 감안하면, 이 33%는 대개 남는 장사다. 멀리 있는 표면일수록 작은 밉 레벨을 참조하므로 캐시에 사이좋게 들어앉기 때문.
4. 레벨 선택과 필터링[편집]
런타임에 GPU는 화면 공간에서 텍스처 좌표의 변화율(편미분)을 가지고 어떤 레벨을 뽑을지 정한다. 인접 픽셀 간 텍스처 좌표 도함수 등으로부터 픽셀 하나가 덮는 텍셀 개수 를 추정하고, 밉 레벨을
로 계산한다. 는 대개 정수가 아니므로, 위아래 두 정수 레벨을 각각 이중선형 보간(bilinear)한 뒤 그 둘을 다시 선형 보간한다. 이것이 **트라이리니어 필터링(trilinear filtering)**이다. 레벨 경계에서 갑자기 해상도가 튀는 밉 밴딩(mip banding)을 부드럽게 문질러 없애 준다.
다만 정통 밉맵은 픽셀 footprint를 정사각형으로 가정한다. 그래서 표면이 시선에 비스듬히 누우면(경사면 바닥 등) footprint가 길쭉한 직사각형이 되는데, 정사각형 밉을 쓰면 짧은 축 기준으로 과하게 흐려진다. 이 과블러(over-blur)를 잡는 것이 **이방성 필터링(anisotropic filtering)**으로, 긴 축을 따라 여러 밉 샘플을 뽑아 적분한다. 요즘 게임 옵션에 흔한 “AF 16ד가 바로 이것.3
5. 확장과 응용[편집]
밉맵의 발상은 단순 텍스처 축소를 훨씬 넘어선다.
- 밉맵 밴딩 방지 이상의 성능 이점: 작은 밉 레벨은 텍스처 메모리 대역폭을 극적으로 아낀다. 앨리어싱 억제는 원래 목적이지만, 실전에서는 대역폭 절감이 더 큰 이득일 때가 많다.
- 레벨 오브 디테일의 사촌: 밉맵이 텍스처 해상도의 LOD라면, 메시 LOD는 형상 해상도의 LOD다. 발상이 닮았다.
- 앰비언트 오클루전·전역 조명: 프리필터링된 환경 맵(prefiltered environment map)의 거칠기(roughness)별 반사를 밉 레벨에 인코딩하는 것이 물리 기반 렌더링의 표준이다. 거칠수록 높은 밉을 참조한다.
- 그림자 매핑의 변형: VSM 등 통계 기반 섀도우 기법은 섀도우 맵을 밉맵/블러해 소프트 섀도우를 얻는다.
- 가상 텍스처링·클립맵: 지형처럼 거대한 텍스처를 다룰 때 밉 피라미드를 스트리밍 단위로 쓴다.
밉 레벨 생성을 box filter가 아니라 가우시안이나 커스텀 커널로 바꾸거나, 감마 공간이 아닌 선형 색 공간에서 평균 내는 등의 디테일이 최종 화질을 좌우한다. sRGB 텍스처를 감마 공간 그대로 평균 내면 밝기가 어두워지는 흔한 버그가 여기서 나온다.4
6. 관련 문서[편집]
7. Footnotes[편집]
-
multum in parvo는 라틴어 격언으로 “작은 그릇에 많은 것이 담긴다”는 뜻이다. 텍스처 하나에 여러 해상도를 욱여넣는다는 점에서 작명 센스가 꽤 정확하다. 참고로 발음은 “밉맵”이지 “미핍맵”이 아니다. ↩
-
3D 텍스처(볼륨)에서는 각 레벨이 1/8이라 총량이 배로 오버헤드가 더 작다. 반대로 큐브맵은 6면이라 상수만 커진다. ↩
-
AF는 밉맵과 별개가 아니라 밉맵 위에 얹는 기법이다. AF를 끄고 밉맵만 켜면 비스듬한 바닥이 저 멀리서 죽처럼 뭉개지고, 밉맵을 끄고 AF만 켤 수는 없다. 애초에 밉이 없으면 AF가 뽑을 샘플이 없다. ↩
-
“왜 우리 게임 원경 텍스처만 유독 칙칙하죠?”의 8할은 감마 공간에서 밉을 생성한 탓이다. 색은 반드시 선형 공간에서 평균 내고 다시 감마로 인코딩해야 한다. 툴체인이 이걸 자동으로 안 해 주면 사람이 갈려 나간다. ↩