everything about early-z
DESCRIPTION
HW에서 지원하는 Hi-Z, Early-Z에 대한 내용과 이를 이용하기 위한 SW적인 방법인 z pre-pass등이 뭔지에 관한 발표 자료 (주석은 pdf로 다운 받으면 보입니다) 14/09/22 Shader study에서 발표TRANSCRIPT
EVERYTHING ABOUT EARLY-Z
인성민 × shader studycafe.naver.com/shader
Q.DX/OGL 파이프라인 상 Depth Test는 언제 일어나는가?
Q.그렇다면 DX11/OGL4에서는?
Q.Early-Z가 활성화 되는 조건이 어떻게 되는가?
Q.Hi-Z와 Early-Z의 차이는 무엇인가?
모르는 것이 있다면 오늘 건질 것은 있음짝짝짝
Depth Test는 PS 이후에 수행(이하 D/T)
Depth Test는 PS 이후에 수행
DX8 때도 그랬고 DX11인 현재까지도 변함 없음
D/T가 PS 이후에 수행되는 이유
HW T&L 시절에는 PS 이후에 수행해도 무방했음(추정)
D/T는 원래 Z-sorting을 하기 위한 연산임
그럼 단순히 하위 호환성 때문?
PS에서 depth가 결정되는 경우가 있어 PS 앞에서 하지 못함
시간은 흘러 PS 비용이 비싸지니...
GC 벤더들이 D/T를 PS앞에서 수행하도록 HW 파이프라인을 변경
즉, HW에서 지원하지 않으면 안되는 기능임
이를 위하여 구현된 기능을 살펴보면...
Hierarchical-Z Culling
Early-Z Culling
Double Speed Depth Only
Hierarchical-Z Culling == Coarse-grained Z Culling
A당 N당
Hi-Z == ZCULL
줄여서
A당에서는 HD2000 시리즈 이전 부터 지원했던걸로 보이고
N당에서는 GeForce 6000 시리즈 부터 지원하기 시작하였음
GeForce 8000 이후에나 ZCULL과 Ealry-Z를 구분하기 시작그 전까지는 ZCULL와 Early-Z 같은 의미로 사용하는 듯 (망할놈들...)
Hi-Z와 Early-Z는 다른 기능
가장 큰 차이는 Early-Z는 픽셀 단위의 연산이지만
Hi-Z는 타일 단위의 연산임
HW에 별도의 Depth Buffer가 존재하는데
타일의 크기에 따라 다르지만 원래 크기보다는 작음
이는 해당 타일의 대표값을 저장하고 있으며
Rasterization을 거친 타일의 픽셀들의 깊이 값이
버퍼보다 크거나 작으면 해당 타일의 연산을 모두 스킵
Hi-Z가 실패하면 Early-Z로 넘어감
Hi-Z는 HW의 기능이므로 비활성화 조건도 HW마다 다름
Early-Z Culling == Fine-grained Z Culling
N당은 GeForce 8000 시리즈 부터 지원하였지만
A당은 그보다 훨씬 전부터 지원한 것으로 보임
Early-Z는 앞에서 얘기한데로 픽셀 단위로 수행되며
별도의 버퍼가 아닌 D/S 버퍼를 사용
기본적으로 PS에서 oDepth값을 갱신하면 비활성화 되지만
DX11의 경우에는 예외가 있음요것과 관련해서는 이후에 설명
Double Speed Depth Only
A당에는 있는지는 확인하지 못했지만
N당의 경우에는 GeForce 6000 시리즈부터 지원
특정 조건을 만족하면
Depth를 빠르게 저장할 수 있도록 해줌
HW에서 이러한 기능들을 지원해주면
암시적으로 불필요한 PS 연산을 reject할 수 있음
대표적인 방법으로는 front-to-back ordered rendering이 있음
가장 앞에 있는 물체를 먼저 그림으로써
뒤에 있는 물체들을 그릴 때 PS연산을 줄이는 방법
하지만 Grouping을 깊이값으로 한다면
더 비싼 비용인 상태 변경이 발생함같은 R/S의 물체들을 같이 그리지 못함
따라서 보통은 이 방법보다는 Early-Z Pass를 두는 방법을 이용
Early-Z Pass == Pre-Z Pass == Z Pre-Pass
Early-Z Pass는 Depth만 그리는 Pass를 먼저 수행하고
다음 패스에서는 Depth Write를 비활성화 하고 그리는 방법임
그럼 명시적으로 Early-Z를 활성화 하려면?
[earlydepthstencil]하지만 PS 5.0 attribute
Hi-Z와 Early-Z 모두 PS에서 depth를 쓰면 비활성화 됨
그럼 depth를 쓰면 모든 early rejection이 발생하지 않는다?
아니오
Conservative Depth Output
PS에서 depth를 쓰더라도 조건을 만족시켜주면 Hi-Z 수행
하지만 마찬가지로 DX11/OGL4 기능임...
SUMMARY
1.D/T는 PS 이후에 발생한다
2.조건을 만족하면 HW가 PS 연산 이전에 해주기도 한다PS에서 깊이값을 갱신하지 않으면
3.Hi-Z는 Early-Z보다 먼저 발생한다
REFERENCE
Self-Shadow : Overdraw in overdrive[Blog] http://blog.selfshadow.com/publications/overdraw-in-overdrive/
The ryg Blog : A trip through the graphics pipeline[Blog] http://fgiesen.wordpress.com/2011/07/10/a-trip-through-the-graphics-pipeline-2011-part-8/
The danger zone : Conservative depth output[Blog] http://mynameismjp.wordpress.com/2010/11/14/d3d11-features/
Z-Buffer Optimizations[Presentation] http://www.seas.upenn.edu/~cis565/LECTURES/Z-Buffer%20Optimizations.ppt
Practical rendering & computation with DX11[Book] Chapter 3.11 Pixel Shader (p.221~)
QUESTION?Q&A