
모바일과 저사양 PC를 위한 그래픽 최적화: LOD 및 밉맵 스케일링의 원리와 실전 적용
저사양 디바이스에서 프레임 레이트와 메모리 대역폭을 확보하기 위한 핵심 기술인 LOD(Level of Detail)와 밉맵(Mipmap) 스케일링의 내부 동작 원리 및 엔진별 실전 최적화 기법을 다룹니다.
모바일과 저사양 PC 환경에서 안정적인 프레임 레이트(FPS)를 유지하는 것은 게임의 완성도를 좌우하는 핵심 요소입니다. 하드웨어의 연산 성능과 메모리 대역폭이 제한적인 환경에서는 화면에 그려지는 그래픽 자원의 수량을 지능적으로 조절해야 합니다. 이러한 최적화의 중심에 있는 두 기법이 바로 LOD(Level of Detail)와 밉맵(Mipmap) 스케일링입니다.
두 기술은 공통적으로 관찰자(카메라)와의 거리에 따라 자원의 정밀도를 단계적으로 낮추는 방식을 취합니다. 렌더링 파이프라인에서 시각적 품질 손실은 최소화하면서 연산 병목을 제거하는 세부 원리와 구현 방법을 살펴봅니다.
1. 렌더링 파이프라인의 병목 원인과 관찰자 거리
3D 렌더링 파이프라인에서 성능 저하를 유발하는 주된 요인은 크게 정점 연산 오버헤드(Vertex Processing Overhead)와 텍스처 픽셀 셰이딩 대역폭(Fill-rate & Bandwidth)으로 나뉩니다.
오브젝트가 카메라에서 멀어지면 화면에서 차지하는 픽셀 면적은 거리의 제곱에 반비례하여 급격히 줄어듭니다.
카메라에서 멀리 떨어진 3D 모델의 폴리곤 수가 수만 개에 달하더라도 실제 화면상에는 불과 몇 픽셀 크기로 출력됩니다. 이 경우 화면 표현에 기여하지 못하는 정점 연산에 렌더링 시간의 상당 부분이 낭비됩니다. 고해상도 텍스처 역시 멀리 있는 작은 오브젝트에 렌더링될 때 텍셀(Texel) 밀도가 픽셀(Pixel) 밀도를 과도하게 초과하면서 메모리 캐시 미스(Memory Cache Miss)와 에일리어싱(Aliasing) 현상을 유발합니다.

이러한 불필요한 연산 낭비를 막기 위해 정점 데이터는 LOD로 텍스처 데이터는 밉맵 스케일링으로 처리하여 카메라 거리에 맞게 해상도를 동적으로 제어합니다.
2. LOD(Level of Detail) 원리와 디더링 페이드
LOD는 동일한 3D 모델을 폴리곤 수에 따라 여러 단계(LOD 0, LOD 1, LOD 2 등)로 미리 제작해 두고 카메라와의 거리에 따라 적절한 단계의 메시로 교체하여 렌더링하는 기법입니다.
화면 점유율 기반 LOD 선택
최신 게임 엔진은 단순 가상 거리보다 화면상 점유 비율(Screen Coverage Ratio)을 기준으로 LOD 단계를 전환합니다. 렌더링 시 카메라의 시야각(FOV)과 오브젝트의 바운딩 스피어 반경을 고려하여 점유율을 계산합니다.
이 공식에서 은 오브젝트의 바운딩 반경, 는 카메라의 시야각, 는 투영 거리를 나타냅니다.
flowchart TD
A[오브젝트 바운딩 스피어 계산] --> B[카메라 투영 거리 d 측정]
B --> C[화면 점유 비율 S_screen 계산]
C --> D{LOD 임계값 비교}
D -- S_screen >= T0 --> E[LOD 0 High-poly Mesh 렌더링]
D -- T1 <= S_screen < T0 --> F[LOD 1 Mid-poly Mesh 렌더링]
D -- S_screen < T1 --> G[LOD 2 Low-poly Mesh 또는 Culling]
LOD 팝핑 현상 방지: 디더링 크로스 페이드
메시가 전환될 때 순간적으로 입체 형태가 바뀌며 시각적 거슬림이 발생하는 현상을 ‘팝핑(Popping)‘이라고 합니다. 이를 완화하기 위해 두 LOD 메시를 시공간적으로 자연스럽게 섞어주는 디더링 페이드(Dithered Cross-fade) 기법을 사용합니다.
아래 셰이더 코드는 HLSL 기반으로 Screen Door Dither 패턴을 생성하여 LOD 전환 구간 동안 두 메시의 투명도를 교차 제어하는 예시입니다.
// Screen-Space Dither Pattern을 이용한 LOD 크로스 페이드 HLSL 셰이더 예시
float4x4 _DitherPattern = {
1.0/17.0, 9.0/17.0, 3.0/17.0, 11.0/17.0,
13.0/17.0, 5.0/17.0, 15.0/17.0, 7.0/17.0,
4.0/17.0, 12.0/17.0, 2.0/17.0, 10.0/17.0,
14.0/17.0, 6.0/17.0, 16.0/17.0, 8.0/17.0
};
void ApplyLODDitherFade(float2 screenPos, float transitionFactor)
{
uint2 pixelPos = uint2(fmod(screenPos.x, 4.0), fmod(screenPos.y, 4.0));
float ditherThreshold = _DitherPattern[pixelPos.x][pixelPos.y];
// transitionFactor가 ditherThreshold보다 작으면 해당 픽셀 렌더링 취소 (clip)
if (transitionFactor - ditherThreshold < 0.0)
{
clip(-1);
}
}
3. 밉맵(Mipmap) 스케일링과 메모리 대역폭 최적화
밉맵은 원본 텍스처의 해상도를 1/2, 1/4, 1/8 크기로 축소한 축소 이미지 피라미드를 미리 생성해 두는 기술입니다.
메모리 사용량과 캐시 효율성
밉맵을 적용하면 전체 텍스처 메모리 용량이 기존 원본 대비 약 33.3% 증가합니다.
메모리 용량이 커짐에도 불구하고 밉맵을 필수로 사용하는 이유는 텍스처 캐시 적중률(Texture Cache Hit Rate) 상승에 따른 메모리 대역폭 절감 효과 때문입니다. 화면상의 1픽셀에 커버되는 텍셀 영역이 작아질 때 원본 텍스처를 듬성듬성 읽어오면 GPU L1/L2 텍스처 캐시 연속성이 깨집니다. 반면 레벨이 적절히 줄어든 밉맵 이미지에서 샘플링하면 텍셀 메모리 주소가 조밀하게 뭉쳐있어 캐시 미스를 획기적으로 줄일 수 있습니다.

텍스처 밉맵 레벨 계산식
GPU의 프래그먼트 셰이더는 스크린 공간 좌표에 대한 UV 좌표의 변화율(Gradient)을 측정하여 적절한 밉맵 레벨 을 수식으로 결정합니다.
이 계산을 통해 먼 거리에 위치한 프래그먼트는 자동으로 높은 밉맵 레벨(낮은 해상도 피라미드)을 샘플링합니다.
4. 엔진별 실전 최적화 설정
유니티(Unity) 최적화 설정
- LOD Group 컴포넌트 활용: 메시 렌더러에 LOD Group을 붙이고 품질 레벨별 화면 점유율 비율(Fade Transition)을 지정합니다.
- Quality Settings Mipmap Limit: 저사양 모바일 빌드 프로필에서는
QualitySettings.globalTextureMipmapLimit을 설정하여 원본 레벨 대신 밉맵 레벨 1 또는 2부터 강제로 사용하도록 제한할 수 있습니다. - Mipmap Streaming: 모든 텍스처를 VRAM에 상주시키지 않고 카메라와의 거리에 맞춰 동적으로 필요한 밉맵 레벨만 메모리에 렌더링 스트리밍합니다.
언리얼 엔진(Unreal Engine) 최적화 설정
- Auto LOD Generation: 메시 에디터의 Reduction Settings를 활용하여 대상 삼각형 비율(Target Triangles Percentage)을 설정하면 앰비언트 오클루전 및 법선 정보를 유지하면서 자동으로 LOD가 생성됩니다.
- Texture Streaming Pool 및 Mip Bias:
r.Streaming.PoolSize콘솔 명령어로 스트리밍 풀 용량을 기기 메모리에 맞게 조절하고 텍스처 자산에서LOD Bias값을 높여 그래픽 메모리 점유율을 줄입니다.
5. 결론: 디바이스 맞춤형 최적화 전략
LOD와 밉맵 스케일링은 단순히 메시의 폴리곤을 깎거나 이미지를 흐리게 만드는 기술이 아닙니다. 디바이스의 제한된 정점 처리 성능과 메모리 버스 대역폭 내에서 그래픽 병목을 철저히 제어하는 계산된 최적화 기법입니다.
모바일 및 저사양 PC를 타깃으로 할 때는 기기의 VRAM 한계와 GPU 아키텍처 특성을 파악하고 LOD 화면 전환 시점과 밉맵 스트리밍 한계를 정교하게 튜닝하는 것이 시각적 품질과 성능의 균형을 이루는 핵심 열쇠입니다.


