같은 픽셀을 여러 번 그리는 것이다. 반투명 오브젝트, 파티클이 많을 때 발생하며 GPU Fill Rate 병목 원인이다.

 

핵심 개념은 같은 픽셀을 여러 번 그리는 것이다.

 

화면 해상도 1920x1080 = 약 200만 픽셀이다.

 

이상적인 경우 각 픽셀이 딱 한 번만 그려진다. 즉, GPU가 200만 번 픽셀 셰이더가 발생한다.

 

하지만 오버드로우가 있는 경우 같은 픽셀 위치에 여러 오브젝트가 겹친다. GPU가 400만, 600만 번 픽셀 셰이더가 실행하게 되며 나중에 그린 것이 앞에 것을 덮어쓴다.

-> 앞에서 한 연산이 전부 버려진다.

 

오버드로우 비율 (Overdraw Ratio)

- 1x = 이상적이며 각 픽셀 한 번이다.

- 2x = 픽셀상 평균 2번 그린다.

- 4x = 픽셀당 평균 4번으로 심각한 성능 문제가 발생한다.

 

오버드로우가 발생하는 상황들

 

1.  불투명 오브젝트 겹침 현상 (Z버퍼로 해결 가능)

- 멀리 있는 벽 먼저 그린다 ( 픽셀 셰이더 실행 )

- 그 앞에 캐릭터들 그린다 ( 픽셀 셰이더 실행 )

-> 벽의 픽셀 연산이 낭비된다.

 

Solution : Early-Z / Z-Prepass

- Z버퍼 통과 여부를 픽셀 셰이더 실행 전에 검사한다. 앞 오브젝트에 가려지면 픽셀 셰이더를 건너뛴다.

 

2. 반투명 오브젝트 (Z버퍼로 해결 불가)

- 파티클, 유리, 연기, 물 같은 것들.

- 뒤에 것이 비쳐 보여야 해서 Z버퍼 기각이 불가능하다.

-> 모든 겹친 레이어를 다 그려야하며 파티클이 많이 겹치면 치명적이다.

 

3.  UI 레이어 겹침 현상

- HUD 위에 메뉴 위에 팝업 위에.... -> 각 레이어가 전체 화면을 다 그린다.

- 화면 전체가 N배 오버드로우

 

4. 파티클 이펙트

- 폭발 이펙트: 수백 개 파티클이 한 곳에 집중된다.

- 각 파티클이 반투명하다

-> 같은 픽셀에 수십 번 픽셀 셰이더 실행된다.

-> 모바일에서 가장 흔한 병목 원인 중 하나다.

 

Z버퍼와 오버드로우의 관계

 

불투명 오브젝트 렌더링 순서

 

렌더링 순서 : 앞에서 뒤로 (Front-to-Back)

- 카메라에 가장 가까운 오브젝트 -> 그 다음 가까운 오브젝트 -> 그 다음.......

 

Early-Z 동작

- 픽셀 셰이더 실행 전에 Z값 비교

- 이미 앞에 뭔가 있을 경우 -> 픽셀 셰이더 건너뛰기 -> 오버드로우 방지

 

Z-Prepass

- 1패스 : 모든 오브젝트를 깊이만 그린다. ( 픽셀 셰이더가 없다 )

- 2패스 : Z버퍼 채워진 상태에서 실제 렌더링

-> 가려진 픽셀은 픽셀 셰이더 실행을 안한다.

-> 복잡한 씬에서 효과적이다.

 

반투명 오브젝트

- 뒤에서 앞으로(Back-to-Front) 그려야 올바른 블렌딩이다.

- Z버퍼 쓰기 비활성화 해야한다. (읽기만)

-> Early-z 작동 안한다.

-> 오버드로우를 피할 수 없다.

 

모바일에서 오버드로우가 특히 치명적인 이유

 

데스크탑 GPU (Immediate Mode Rendering)

- VRAM이 크고 메모리 대역폭이 넓다.

- 오버드로우가 있어도 빠른 메모리로 커버 가능하다.

 

모바일 GPU (Tile-Based Deferred Rendering)

- 화면을 타일로 나눠 온칩 SRAM에서 처리한다.

- 온칩 메모리는 작고 빠르다.

 

오버드로우 발생 시

- 같은 타일을 여러 번 픽셀 셰이더 실행한다.

- 온칩 메모리에서 반복 읽기/쓰기 실행

-> 전력 소모 급증, 발열, 배터리 방전

 

임베디드 디스플레이에서도 동일하다.

제한된 GPU -> 오버드로우 = 즉각적 성능 저하 발생

OpenGL ES 시절부터 오버드로우 최소화가 핵심 과제이다.

 

오버드로우 최적화 전략

 

1. 렌더링 순서 최적화

- 불투명 오브젝트 : 앞에서 뒤로 정렬

- 가장 앞 오브젝트가 Z버퍼를 채우면 뒤 오브젝트의 가려진 픽셀은 Early-Z로 기각

 

2. 반투명 최소화

- 반투명 = 오버드로우의 주범으로 가능하면 불투명으로 대체한다.

- 파티클 : 불투명 스프라이트 사용 가능한지 검토

- 연기 : 경량화된 플립북 텍스처

- 물 : 깊이 기반 단순화

 

3. 파티클 최적화

- 파티클 수 줄이기

-> 시각적 효과는 유지하면서 개수 감소한다. 큰 파티클 몇 개 vs 작은 파티클 많은 개 중 전자가 오버드로우가 적다

 

- LOD 적용

-> 멀리서는 파티클 수 자동 감소한다. Niagara LOD 설정.

 

- Cutout 텍스처

-> 반투명 대신 알파 클리핑 (Masked 모드)

-> 픽셀이 완전 불투명 or 완전 투명

-> Early-Z가 작동하며 오버드로우가 감소된다.

 

4. 오클루전 컬링

- 보이지 않는 오브젝트는 아예 그리지 않는다.

- Frustum Culling : 카메라 밖 오브젝트는 제외한다.

- Occlusion Culling : 다른 오브젝트에 가린 것 제외한다.

-> 오버드로우 자체를 줄이는 근본적 해결 방법이다.

 

5. 셰이더 복잡도 관리

- 오버드로우가 불가피한 경우 (반투명, UI 레이어) 픽셀 셰이더 자체를 가볍게 한다.

- 파티클 머티리얼 : Unlit 사용하며 조명 계산이 없다 -> 픽셀 셰이더 비용 감소한다.

- UI : 단순한 셰이더는 텍스처 1개 + 색상 곱 수준으로 유지한다.

 

알파 블렌딩 vs 알파 클리핑 ( 오버드로우 관점 )

 

알파 블렌딩 (Alpha Blending /  Translucent)

- 픽셀이 반투명할 경우 Z버퍼 쓰기 비활성화 한다.

- 겹친 모든 레이어를 그려야 한다.

-> 오버드로우 발생

- result = src * srcAlpha + dst * (1 - srcAlpha)

- 나뭇잎, 파티클, 유리에 사용한다.

- 오버드로우 피할 수 없기에 셰이더를 가볍게 한다.

 

알파 클리핑 (Alpha Clipping / Masked)

- 픽셀이 임계값 이상이면 완전 불투명하다

- 임계값 이하면 완전 투명으로 하며 그리지 않는다.

- Z버퍼 쓰기 활성화하며 Early-Z가 작동된다.

- if(alpha < threshold) discard;

- 나뭇잎(외곽선), 철망, 헤어카드에 사용한다.

- 오버드로우 방지 가능하다.

- 외곽선이 계단처럼 보이는 (앨리어싱) 단점이 있으며 Temporal AA로 보완 가능하다.

 

연결되는 단어들

- Fill Rate : GPU가 초당 채울 수 있는 픽셀 수. 오버드로우가 많으면 Fill Rate 한계에 도달한다. 모바일 GPU에서 가장 먼저 포화되는 리소스이다.

-  Early-Z / Z-Prepass : 픽셀 셰이더 실행 전에 깊이 테스트로 가려진 픽셀을 기각하는 최적화이다. 오버드로우의 구조적 해결책.

- Shader Complexity : UE5의 오버드로우 시각화 뷰이다. 초록->노랑->빨강->흰색 순으로 셰이더 비용이 높아진다. 파티클 이펙트 최적화의 시작점이다.

- Separate Translucency : UE5에서 반투명 오브젝트를 낮은 해상도에서 따로 렌더링하는 옵션이다. 오버드로우 비용을 절반으로 줄이는 효과가 있다.

'Word' 카테고리의 다른 글

렌더링 파이프라인 (Rendering Pipeline)  (0) 2026.07.29
텍스처 샘플링 (Texture Sampling)  (0) 2026.07.28
UV 매핑 (UV Mapping)  (0) 2026.07.22
노멀 맵 (Normal Map)  (0) 2026.07.21
컴퓨트 셰이더 ( Compute Shader )  (0) 2026.07.20

+ Recent posts