everything about early-z
DESCRIPTION
HW에서 지원하는 Hi-Z, Early-Z에 대한 내용과 이를 이용하기 위한 SW적인 방법인 z pre-pass등이 뭔지에 관한 발표 자료 (주석은 pdf로 다운 받으면 보입니다) 14/09/22 Shader study에서 발표TRANSCRIPT
![Page 1: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/1.jpg)
EVERYTHING ABOUT EARLY-Z
인성민 × shader studycafe.naver.com/shader
![Page 2: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/2.jpg)
Q.DX/OGL 파이프라인 상 Depth Test는 언제 일어나는가?
![Page 3: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/3.jpg)
Q.그렇다면 DX11/OGL4에서는?
![Page 4: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/4.jpg)
Q.Early-Z가 활성화 되는 조건이 어떻게 되는가?
![Page 5: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/5.jpg)
Q.Hi-Z와 Early-Z의 차이는 무엇인가?
![Page 6: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/6.jpg)
모르는 것이 있다면 오늘 건질 것은 있음짝짝짝
![Page 7: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/7.jpg)
Depth Test는 PS 이후에 수행(이하 D/T)
![Page 8: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/8.jpg)
Depth Test는 PS 이후에 수행
![Page 9: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/9.jpg)
DX8 때도 그랬고 DX11인 현재까지도 변함 없음
![Page 10: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/10.jpg)
D/T가 PS 이후에 수행되는 이유
![Page 11: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/11.jpg)
HW T&L 시절에는 PS 이후에 수행해도 무방했음(추정)
![Page 12: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/12.jpg)
D/T는 원래 Z-sorting을 하기 위한 연산임
![Page 13: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/13.jpg)
그럼 단순히 하위 호환성 때문?
![Page 14: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/14.jpg)
PS에서 depth가 결정되는 경우가 있어 PS 앞에서 하지 못함
![Page 15: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/15.jpg)
시간은 흘러 PS 비용이 비싸지니...
![Page 16: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/16.jpg)
GC 벤더들이 D/T를 PS앞에서 수행하도록 HW 파이프라인을 변경
![Page 17: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/17.jpg)
즉, HW에서 지원하지 않으면 안되는 기능임
![Page 18: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/18.jpg)
이를 위하여 구현된 기능을 살펴보면...
![Page 19: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/19.jpg)
Hierarchical-Z Culling
![Page 20: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/20.jpg)
Early-Z Culling
![Page 21: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/21.jpg)
Double Speed Depth Only
![Page 22: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/22.jpg)
Hierarchical-Z Culling == Coarse-grained Z Culling
A당 N당
![Page 23: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/23.jpg)
Hi-Z == ZCULL
줄여서
![Page 24: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/24.jpg)
A당에서는 HD2000 시리즈 이전 부터 지원했던걸로 보이고
![Page 25: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/25.jpg)
N당에서는 GeForce 6000 시리즈 부터 지원하기 시작하였음
![Page 26: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/26.jpg)
GeForce 8000 이후에나 ZCULL과 Ealry-Z를 구분하기 시작그 전까지는 ZCULL와 Early-Z 같은 의미로 사용하는 듯 (망할놈들...)
![Page 27: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/27.jpg)
Hi-Z와 Early-Z는 다른 기능
![Page 28: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/28.jpg)
가장 큰 차이는 Early-Z는 픽셀 단위의 연산이지만
![Page 29: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/29.jpg)
Hi-Z는 타일 단위의 연산임
![Page 30: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/30.jpg)
HW에 별도의 Depth Buffer가 존재하는데
![Page 31: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/31.jpg)
타일의 크기에 따라 다르지만 원래 크기보다는 작음
![Page 32: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/32.jpg)
이는 해당 타일의 대표값을 저장하고 있으며
![Page 33: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/33.jpg)
Rasterization을 거친 타일의 픽셀들의 깊이 값이
![Page 34: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/34.jpg)
버퍼보다 크거나 작으면 해당 타일의 연산을 모두 스킵
![Page 35: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/35.jpg)
Hi-Z가 실패하면 Early-Z로 넘어감
![Page 36: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/36.jpg)
Hi-Z는 HW의 기능이므로 비활성화 조건도 HW마다 다름
![Page 37: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/37.jpg)
Early-Z Culling == Fine-grained Z Culling
![Page 38: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/38.jpg)
N당은 GeForce 8000 시리즈 부터 지원하였지만
![Page 39: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/39.jpg)
A당은 그보다 훨씬 전부터 지원한 것으로 보임
![Page 40: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/40.jpg)
Early-Z는 앞에서 얘기한데로 픽셀 단위로 수행되며
![Page 41: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/41.jpg)
별도의 버퍼가 아닌 D/S 버퍼를 사용
![Page 42: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/42.jpg)
기본적으로 PS에서 oDepth값을 갱신하면 비활성화 되지만
![Page 43: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/43.jpg)
DX11의 경우에는 예외가 있음요것과 관련해서는 이후에 설명
![Page 44: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/44.jpg)
Double Speed Depth Only
![Page 45: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/45.jpg)
A당에는 있는지는 확인하지 못했지만
![Page 46: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/46.jpg)
N당의 경우에는 GeForce 6000 시리즈부터 지원
![Page 47: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/47.jpg)
특정 조건을 만족하면
![Page 48: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/48.jpg)
Depth를 빠르게 저장할 수 있도록 해줌
![Page 49: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/49.jpg)
HW에서 이러한 기능들을 지원해주면
![Page 50: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/50.jpg)
암시적으로 불필요한 PS 연산을 reject할 수 있음
![Page 51: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/51.jpg)
대표적인 방법으로는 front-to-back ordered rendering이 있음
![Page 52: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/52.jpg)
가장 앞에 있는 물체를 먼저 그림으로써
![Page 53: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/53.jpg)
뒤에 있는 물체들을 그릴 때 PS연산을 줄이는 방법
![Page 54: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/54.jpg)
하지만 Grouping을 깊이값으로 한다면
![Page 55: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/55.jpg)
더 비싼 비용인 상태 변경이 발생함같은 R/S의 물체들을 같이 그리지 못함
![Page 56: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/56.jpg)
따라서 보통은 이 방법보다는 Early-Z Pass를 두는 방법을 이용
![Page 57: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/57.jpg)
Early-Z Pass == Pre-Z Pass == Z Pre-Pass
![Page 58: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/58.jpg)
Early-Z Pass는 Depth만 그리는 Pass를 먼저 수행하고
![Page 59: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/59.jpg)
다음 패스에서는 Depth Write를 비활성화 하고 그리는 방법임
![Page 60: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/60.jpg)
그럼 명시적으로 Early-Z를 활성화 하려면?
![Page 61: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/61.jpg)
[earlydepthstencil]하지만 PS 5.0 attribute
![Page 62: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/62.jpg)
Hi-Z와 Early-Z 모두 PS에서 depth를 쓰면 비활성화 됨
![Page 63: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/63.jpg)
그럼 depth를 쓰면 모든 early rejection이 발생하지 않는다?
![Page 64: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/64.jpg)
아니오
![Page 65: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/65.jpg)
Conservative Depth Output
![Page 66: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/66.jpg)
PS에서 depth를 쓰더라도 조건을 만족시켜주면 Hi-Z 수행
![Page 67: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/67.jpg)
하지만 마찬가지로 DX11/OGL4 기능임...
![Page 68: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/68.jpg)
SUMMARY
![Page 69: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/69.jpg)
1.D/T는 PS 이후에 발생한다
![Page 70: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/70.jpg)
2.조건을 만족하면 HW가 PS 연산 이전에 해주기도 한다PS에서 깊이값을 갱신하지 않으면
![Page 71: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/71.jpg)
3.Hi-Z는 Early-Z보다 먼저 발생한다
![Page 72: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/72.jpg)
REFERENCE
![Page 73: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/73.jpg)
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~)
![Page 74: Everything about Early-Z](https://reader034.vdocuments.net/reader034/viewer/2022042602/559876781a28ab30478b48b2/html5/thumbnails/74.jpg)
QUESTION?Q&A