핵심 정리
| 개념 | 역할 |
|---|---|
| Early-Z | fragment shader 전에 depth test 수행 |
| Late-Z | shader 실행 후 depth/stencil test 수행 |
| Depth prepass | 깊이만 먼저 렌더링해 depth buffer 채움 |
| Overdraw | 같은 픽셀을 여러 번 shading하는 비용 |
| Front-to-back | 가까운 물체부터 그려 depth rejection 증가 |
depth prepass
-> depth buffer filled
-> color pass
-> hidden fragments rejected before expensive shading구조
early-z는 fragment shader를 실행하기 전에 depth test로 가려진 fragment를 버리는 최적화입니다. 비싼 조명, texture sampling, parallax 같은 shader 작업을 수행하기 전에 이미 뒤에 있는 픽셀을 제거할 수 있습니다.
without early-z:
fragment shader -> depth test -> discard
with early-z:
depth test -> discard -> skip fragment shaderGPU와 API에 따라 조건은 다르지만, shader가 depth 값을 직접 바꾸거나 discard를 많이 쓰거나 alpha test 성격의 처리를 하면 early-z가 제한될 수 있습니다. 이 경우 depth test가 late-z로 밀려 fragment shader 비용을 먼저 내게 됩니다.
Depth prepass
depth prepass는 첫 pass에서 색을 쓰지 않고 깊이만 채웁니다. 그 다음 color pass에서는 이미 가까운 depth가 채워져 있으므로 뒤쪽 fragment가 early-z에서 더 많이 제거됩니다.
pass 1: opaque geometry, depth write on, color write off
pass 2: opaque geometry, depth test equal/less, color write on장면이 fragment shader 병목이고 overdraw가 높으면 이득이 큽니다. 반대로 vertex 비용이나 draw 제출 비용이 병목이면 geometry를 두 번 그리는 부담이 더 클 수 있습니다.
선택 기준
| 상황 | 접근 |
|---|---|
| 복잡한 opaque shader와 높은 overdraw | depth prepass 검토 |
| 단순 shader, 낮은 overdraw | prepass 이득 제한 |
| foliage, alpha cutout 많음 | early-z 제한 가능성 확인 |
| 투명 렌더링 | depth write와 정렬 정책 분리 |
| tile-based GPU | 아키텍처별 비용 확인 |
front-to-back 정렬은 prepass 없이도 early-z 효율을 높일 수 있습니다. 가까운 물체를 먼저 그리면 뒤쪽 fragment가 더 빨리 제거됩니다.
주의할 점
depth prepass는 항상 빠른 최적화가 아닙니다. 같은 geometry를 한 번 더 그리므로 vertex 처리, draw call, bandwidth 비용이 늘어납니다.
shader에서 discard, alpha clipping, depth output, stencil side effect를 쓰면 early-z가 제한될 수 있습니다. 최적화 판단은 overdraw 시각화와 GPU profiler 결과를 함께 봐야 합니다.