everything about early-z

Post on 05-Jul-2015

150 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

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

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

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

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

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

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

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

Depth Test는 PS 이후에 수행

발표자
프레젠테이션 노트
중요한 것은 DX/OGL 파이프라인 상에서라는 것

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마다 다름

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

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

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

발표자
프레젠테이션 노트
각 픽셀들의 최고값 또는 최저값을 대표값으로 저장

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

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

Hi-Z가 실패하면 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 중요한 것은 하드웨어 벤더마다 다른 것은 물론, 제품군마다 다르기도 하다는 것임

Early-Z Culling == Fine-grained Z Culling

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

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

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

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

기본적으로 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가 비활성됨

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

Double Speed Depth Only

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

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

특정 조건을 만족하면

발표자
프레젠테이션 노트
컬러를 쓰지 않도록 render state를 설정한다거나 등

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

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

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

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

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

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

뒤에 있는 물체들을 그릴 때 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

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

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

top related