같은 픽셀을 여러 번 그리는 것이다. 반투명 오브젝트, 파티클이 많을 때 발생하며 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 |
