3D 게임 그래픽을 플레이하다 보면 카메라가 멀어질수록 바닥이나 벽의 텍스처가 지글거리는 현상이나 계단 현상(Aliasing)을 목격한 적이 있을 것입니다. 이러한 시각적 오류를 방지하고 GPU의 메모리 대역폭을 효율적으로 관리하기 위해 현대 그래픽스 엔진이 채택하고 있는 핵심 기술이 바로 텍스처 밉맵(Texture Mipmap)입니다.
이 글에서는 밉맵의 개념을 명확히 정의하고, 메모리 구조와 텍스처 샘플링 관점에서 밉맵이 그래픽 성능에 미치는 영향을 상세히 분석해 보겠습니다.
1. 텍스처 밉맵(Mipmap)이란?
밉맵은 라틴어 ‘Multum in parvo'(작은 공간 안의 다중)의 약자인 ‘Mip’과 ‘Map’의 합성어로, 하나의 텍스처 이미지에 대해 해상도별로 축소된 여러 장의 보조 이미지 세트를 미리 생성해 둔 구조를 의미합니다.
카메라와의 거리가 가까울 때는 원본 해상도(Level 0)의 텍스처를 사용하지만, 카메라가 멀어지면 멀어질수록 더 작고 저해상도인 밉맵 레벨(Level 1, 2, 3…)의 텍스처를 자동으로 선택하여 샘플링합니다.
밉맵의 메모리 구조
원본 텍스처의 크기가 256 X 256 이라면, 밉맵 체인은 다음과 같은 크기 순으로 단계별로 생성됩니다.
- Level 0: 256 X 256 (원본)
- Level 1: 128 X 128
- Level 2: 64 X 64
- Level 3: 32 X 32
- … (최소 1 X 1 크기까지 축소)
이때 모든 단계의 밉맵 이미지를 합산하더라도 전체 메모리 용량은 원본 텍스처 크기의 약 1.33배(33% 추가)밖에 증가하지 않습니다. 아주 적은 메모리 추가로 렌더링 품질과 성능을 동시에 챙길 수 있는 이유입니다.
2. 텍스처 캐시 누락(Cache Miss)과 메모리 대역폭 최적화
밉맵이 도입된 가장 결정적인 이유는 메모리 대역폭(Memory Bandwidth) 절약과 텍스처 캐시 효율 극대화입니다.
밉맵이 없을 때의 문제점
만약 밉맵이 없는 상태에서 거대한 $2048 \times 2048$ 텍스처가 화면상에서 아주 작은 면적(예: $10 \times 10$ 픽셀)에 그려져야 한다고 가정해 봅시다. 이 경우, 단 하나의 픽셀을 채우기 위해 GPU는 수십 개의 원본 텍스처 픽셀(Texel)을 메모리에서 읽어와 평균을 내야 합니다.
이 과정에서 텍스처 캐시가 미스(Miss)나는 횟수가 급증하고, 비디오 메모리(VRAM)와 GPU 간의 버스 대역폭이 포화되어 심각한 프레임 저하를 유발합니다.
밉맵 적용 시의 개선 효과
적절한 해상도의 밉맵 레벨을 미리 계산하여 사용하면, 화면의 픽셀 크기와 텍스처의 텍셀 크기가 거의 1:1로 일치하게 됩니다.
- 텍스처 캐시 히트율 상승: 필요한 픽셀 데이터가 캐시에 상주할 확률이 높아집니다.
- 텍스처 지글거리기(Aliasing) 방지: 화면 해상도 대비 과도하게 큰 텍스처를 억지로 압축하면서 발생하는 노이즈와 모레 현상이 사라집니다.
3. HLSL 텍스처 샘플링에서의 밉맵 활용
그래픽스 API와 HLSL 셰이더는 카메라와의 거리 및 화면 투영 면적에 따라 적절한 밉맵 레벨을 자동으로 계산(Level of Detail 계산)합니다. 물론 개발자가 직접 특정 레벨을 지정하거나 편법을 사용할 수도 있습니다.
High-level shader language
// HLSL에서 밉맵을 활용한 텍스처 샘플링 예시
Texture2D _MainTex;
SamplerState sampler_MainTex;
float4 frag(v2f i) : SV_Target {
// 1. 기본 샘플링 (그래픽스 하드웨어가 거리와 기울기에 따라 밉맵 레벨 자동 선택)
float4 col = _MainTex.Sample(sampler_MainTex, i.uv);
// 2. 특정 밉맵 레벨을 강제로 지정하여 샘플링하는 예시 (SampleLevel 사용)
// float4 col = _MainTex.SampleLevel(sampler_MainTex, i.uv, 2.0);
return col;
}
트리니어직 필터링(Trilinear Filtering)과 밉맵 부드러움
서로 다른 두 밉맵 레벨(예: Level 1과 Level 2)의 경계선에서 텍스처가 갑자기 바뀌는 이질감을 없애기 위해, 두 레벨의 픽셀 값을 선형 보간하고 텍스처 내부에서도 필터링을 거치는 트리니어 필터링이 적용됩니다. 이를 통해 거리에 따른 텍스처 전환이 눈에 띄지 않게 부드럽게 이루어집니다.
요약 및 결론
텍스처 밉맵은 단 33%의 메모리 추가만으로 그래픽스 파이프라인의 메모리 대역폭 부담을 획기적으로 줄이고, 원거리 객체의 렌더링 노이즈를 방지하는 핵심 최적화 기술입니다.
UI나 고정된 2D 그래픽스를 제외하고, 3D 공간에 배치되는 대부분의 오브젝트 텍스처에는 반드시 밉맵을 활성화하여 GPU 성능을 보호해야 합니다.