Quick Flow
| 개념 | 역할 |
|---|---|
| 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| 확인할 조건 | prepass가 유리해질 가능성 |
|---|---|
| fragment 비용과 overdraw | 높음 |
| vertex·draw submission 비용 | 낮음 |
| opaque material 비율 | 높음 |
| tile-based GPU | capture로 실제 store/load 비용 확인 |
구조
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 비용을 먼저 내게 됩니다.
early-Z는 API가 보장하는 단일 명령이 아니라 GPU가 안전하다고 판단할 때 하는 최적화입니다. discard, fragment depth output, depth/stencil side effect, blending과 shader의 메모리 side effect는 구현체가 early rejection을 제한하게 만들 수 있습니다. "shader에 discard가 없으니 항상 early-Z"라고 단정하지 않고 GPU capture의 early/late depth 통계로 확인합니다.
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가 더 빨리 제거됩니다.
prepass와 color pass의 depth compare도 계약입니다. prepass가 depth를 쓴 뒤 color pass가 EQUAL을 쓰면 polygon offset·depth quantization·animation 차이에서 누락이 생길 수 있고, LESS_EQUAL은 더 안전하지만 일부 overdraw를 남길 수 있습니다. 같은 vertex displacement와 alpha-clip 규칙을 두 pass에 적용하지 않으면 보이는 표면이 depth에서 빠질 수 있습니다.
주의할 점
depth prepass는 항상 빠른 최적화가 아닙니다. 같은 geometry를 한 번 더 그리므로 vertex 처리, draw call, bandwidth 비용이 늘어납니다.
shader에서 discard, alpha clipping, depth output, stencil side effect를 쓰면 early-z가 제한될 수 있습니다. 최적화 판단은 overdraw 시각화와 GPU profiler 결과를 함께 봐야 합니다.
depth prepass는 shadow pass와 다른 목적입니다. shadow map을 이미 만들었다고 camera depth prepass가 생략되는 것은 아니며, 화면 camera의 depth test와 opaque overdraw를 기준으로 따로 측정합니다.