74
EVERYTHING ABOUT EARLY-Z 인성민 × shader study cafe.naver.com/shader

Everything about Early-Z

Embed Size (px)

DESCRIPTION

HW에서 지원하는 Hi-Z, Early-Z에 대한 내용과 이를 이용하기 위한 SW적인 방법인 z pre-pass등이 뭔지에 관한 발표 자료 (주석은 pdf로 다운 받으면 보입니다) 14/09/22 Shader study에서 발표

Citation preview

Page 1: Everything about Early-Z

EVERYTHING ABOUT EARLY-Z

인성민 × shader studycafe.naver.com/shader

발표자
프레젠테이션 노트
건방지게 Advance를 붙인것은 예전의 발표에서 최신 HW에 대한 내용이 +a 되었다는 의미로 붙인것임
Page 2: Everything about Early-Z

Q.DX/OGL 파이프라인 상 Depth Test는 언제 일어나는가?

Page 3: Everything about Early-Z

Q.그렇다면 DX11/OGL4에서는?

Page 4: Everything about Early-Z

Q.Early-Z가 활성화 되는 조건이 어떻게 되는가?

Page 5: Everything about Early-Z

Q.Hi-Z와 Early-Z의 차이는 무엇인가?

Page 6: Everything about Early-Z

모르는 것이 있다면 오늘 건질 것은 있음짝짝짝

Page 7: Everything about Early-Z

Depth Test는 PS 이후에 수행(이하 D/T)

Page 8: Everything about Early-Z

Depth Test는 PS 이후에 수행

발표자
프레젠테이션 노트
중요한 것은 DX/OGL 파이프라인 상에서라는 것
Page 9: Everything about Early-Z

DX8 때도 그랬고 DX11인 현재까지도 변함 없음

Page 10: Everything about Early-Z

D/T가 PS 이후에 수행되는 이유

Page 11: Everything about Early-Z

HW T&L 시절에는 PS 이후에 수행해도 무방했음(추정)

발표자
프레젠테이션 노트
인터넷을 찾아보면 위와 같은 이야기도 종종 있음
Page 12: Everything about Early-Z

D/T는 원래 Z-sorting을 하기 위한 연산임

Page 13: Everything about Early-Z

그럼 단순히 하위 호환성 때문?

Page 14: Everything about Early-Z

PS에서 depth가 결정되는 경우가 있어 PS 앞에서 하지 못함

Page 15: Everything about Early-Z

시간은 흘러 PS 비용이 비싸지니...

Page 16: Everything about Early-Z

GC 벤더들이 D/T를 PS앞에서 수행하도록 HW 파이프라인을 변경

Page 17: Everything about Early-Z

즉, HW에서 지원하지 않으면 안되는 기능임

Page 18: Everything about Early-Z

이를 위하여 구현된 기능을 살펴보면...

Page 19: Everything about Early-Z

Hierarchical-Z Culling

Page 20: Everything about Early-Z

Early-Z Culling

Page 21: Everything about Early-Z

Double Speed Depth Only

Page 22: Everything about Early-Z

Hierarchical-Z Culling == Coarse-grained Z Culling

A당 N당

Page 23: Everything about Early-Z

Hi-Z == ZCULL

줄여서

Page 24: Everything about Early-Z

A당에서는 HD2000 시리즈 이전 부터 지원했던걸로 보이고

Page 25: Everything about Early-Z

N당에서는 GeForce 6000 시리즈 부터 지원하기 시작하였음

Page 26: Everything about Early-Z

GeForce 8000 이후에나 ZCULL과 Ealry-Z를 구분하기 시작그 전까지는 ZCULL와 Early-Z 같은 의미로 사용하는 듯 (망할놈들...)

Page 27: Everything about Early-Z

Hi-Z와 Early-Z는 다른 기능

Page 28: Everything about Early-Z

가장 큰 차이는 Early-Z는 픽셀 단위의 연산이지만

Page 29: Everything about Early-Z

Hi-Z는 타일 단위의 연산임

발표자
프레젠테이션 노트
타일의 크기는 HW마다 다름
Page 30: Everything about Early-Z

HW에 별도의 Depth Buffer가 존재하는데

Page 31: Everything about Early-Z

타일의 크기에 따라 다르지만 원래 크기보다는 작음

Page 32: Everything about Early-Z

이는 해당 타일의 대표값을 저장하고 있으며

발표자
프레젠테이션 노트
각 픽셀들의 최고값 또는 최저값을 대표값으로 저장
Page 33: Everything about Early-Z

Rasterization을 거친 타일의 픽셀들의 깊이 값이

Page 34: Everything about Early-Z

버퍼보다 크거나 작으면 해당 타일의 연산을 모두 스킵

Page 35: Everything about Early-Z

Hi-Z가 실패하면 Early-Z로 넘어감

Page 36: Everything about Early-Z

Hi-Z는 HW의 기능이므로 비활성화 조건도 HW마다 다름

발표자
프레젠테이션 노트
N당 GeForce8000 문서에 의하면 ZCULL 비활성 조건은 DS 버퍼를 초기화 할 때 Clears를 사용하지 않는 경우 PS에서 깊이 값을 쓰는 경우 깊이 값을 쓰는데 깊이 비교 방향을 바꾸는 경우 다음 Clear 전까지 동작하지 않음 A당 문서(Depth in Depth)에서 말하는 Hi-Z 비활성 조건은 PS에서 깊이 값을 쓰는 경우 스텐실 op가 실패하거나 zfail이 KEEP인 경우 깊이 비교시 EQUAL을 사용하는 경우 (일부 초기 하드웨어) 깊이 비교시 NOTEQUAL을 사용하는 경우 Reversed depth comparsion direction 중요한 것은 하드웨어 벤더마다 다른 것은 물론, 제품군마다 다르기도 하다는 것임
Page 37: Everything about Early-Z

Early-Z Culling == Fine-grained Z Culling

Page 38: Everything about Early-Z

N당은 GeForce 8000 시리즈 부터 지원하였지만

Page 39: Everything about Early-Z

A당은 그보다 훨씬 전부터 지원한 것으로 보임

Page 40: Everything about Early-Z

Early-Z는 앞에서 얘기한데로 픽셀 단위로 수행되며

Page 41: Everything about Early-Z

별도의 버퍼가 아닌 D/S 버퍼를 사용

Page 42: Everything about Early-Z

기본적으로 PS에서 oDepth값을 갱신하면 비활성화 되지만

발표자
프레젠테이션 노트
N당 GeForce8000 문서에 따르면 Early-Z 비활성 조건은 PS에서 깊이 값을 쓰는 경우 깊이 또는 스텐실 쓰기가 true이거나 Occlusion Query가 활성화 된 상태에서 아래의 조건중 하나라도 true인 경우 - A/T가 활성 - PS가 픽셀을 kill (clip(), texkill, discard) - A2C가 활성 - SampleMask가 0xFFFFFFFF가 아닌 경우 A당 문서에 따르면 Early-Z 비활성 조건은 PS에서 깊이 값을 쓰는 경우 A/T, A2C 또는 PS가 픽셀을 kill하는 경우 DX11의 경우 UAV에 쓰는 경우에도 기본적 Hi-Z와 Early-Z가 비활성됨
Page 43: Everything about Early-Z

DX11의 경우에는 예외가 있음요것과 관련해서는 이후에 설명

Page 44: Everything about Early-Z

Double Speed Depth Only

Page 45: Everything about Early-Z

A당에는 있는지는 확인하지 못했지만

Page 46: Everything about Early-Z

N당의 경우에는 GeForce 6000 시리즈부터 지원

Page 47: Everything about Early-Z

특정 조건을 만족하면

발표자
프레젠테이션 노트
컬러를 쓰지 않도록 render state를 설정한다거나 등
Page 48: Everything about Early-Z

Depth를 빠르게 저장할 수 있도록 해줌

Page 49: Everything about Early-Z

HW에서 이러한 기능들을 지원해주면

Page 50: Everything about Early-Z

암시적으로 불필요한 PS 연산을 reject할 수 있음

Page 51: Everything about Early-Z

대표적인 방법으로는 front-to-back ordered rendering이 있음

발표자
프레젠테이션 노트
여기서 부터는 HW에서 지원하는 Hi-Z, Early-Z 등을 써먹기 위해서는 프로그래머가 어떻게 해줘야 하는지에 대한 내용
Page 52: Everything about Early-Z

가장 앞에 있는 물체를 먼저 그림으로써

Page 53: Everything about Early-Z

뒤에 있는 물체들을 그릴 때 PS연산을 줄이는 방법

Page 54: Everything about Early-Z

하지만 Grouping을 깊이값으로 한다면

Page 55: Everything about Early-Z

더 비싼 비용인 상태 변경이 발생함같은 R/S의 물체들을 같이 그리지 못함

Page 56: Everything about Early-Z

따라서 보통은 이 방법보다는 Early-Z Pass를 두는 방법을 이용

Page 57: Everything about Early-Z

Early-Z Pass == Pre-Z Pass == Z Pre-Pass

Page 58: Everything about Early-Z

Early-Z Pass는 Depth만 그리는 Pass를 먼저 수행하고

Page 59: Everything about Early-Z

다음 패스에서는 Depth Write를 비활성화 하고 그리는 방법임

Page 60: Everything about Early-Z

그럼 명시적으로 Early-Z를 활성화 하려면?

Page 61: Everything about Early-Z

[earlydepthstencil]하지만 PS 5.0 attribute

발표자
프레젠테이션 노트
정확하게 확인은 못했지만 위의 특성을 설정하면 PS에서 값을 쓰는 경우 컴파일 에러를 발생시키는 것으로 보임
Page 62: Everything about Early-Z

Hi-Z와 Early-Z 모두 PS에서 depth를 쓰면 비활성화 됨

Page 63: Everything about Early-Z

그럼 depth를 쓰면 모든 early rejection이 발생하지 않는다?

Page 64: Everything about Early-Z

아니오

Page 65: Everything about Early-Z

Conservative Depth Output

Page 66: Everything about Early-Z

PS에서 depth를 쓰더라도 조건을 만족시켜주면 Hi-Z 수행

발표자
프레젠테이션 노트
자세한 내용은 맨 뒤에 나오는 참고서적을 참조
Page 67: Everything about Early-Z

하지만 마찬가지로 DX11/OGL4 기능임...

Page 68: Everything about Early-Z

SUMMARY

Page 69: Everything about Early-Z

1.D/T는 PS 이후에 발생한다

Page 70: Everything about Early-Z

2.조건을 만족하면 HW가 PS 연산 이전에 해주기도 한다PS에서 깊이값을 갱신하지 않으면

Page 71: Everything about Early-Z

3.Hi-Z는 Early-Z보다 먼저 발생한다

Page 72: Everything about Early-Z

REFERENCE

Page 73: Everything about Early-Z

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

QUESTION?Q&A