Early-Depth-Culling ist einfach eine Optimierung die die Grafikkarte unter bestimmten Gegebenheiten machen kann. Der Depth-Test findet normal ja erst nach dem PixelShader statt. Wenn aber der Shader die Fragment-Depth nicht verändert (bzw. mit D3D11 nur in konservativer Weise), etc. kann die Grafikkarte den Depth-Test schon vor dem PixelShader (also Early
) machen und dadurch die Ausführung des Shaders für Fragmente die sowieso nicht sichtbar sind sparen. Der Early-Depth-Test kann, vor allem wenn du Fragment-Bound bist (was heute eher der Regelfall ist), sehr viel ausmachen. Darum haben sich so Techniken entwickelt wie z.B. dass man möglichst Front-To-Back oder überhaupt zuerst einmal nur die Tiefe der ganzen Szene rendert (manche Grafikkarten (NVIDIA) haben auch extra dafür bestimmte Optimierungen) und erst dann mit dem nun schon gefüllten DepthBuffer weitermacht. Wie, wann, wo und ob die Grafikkarte Early-Depth-Culling macht kannst du nicht beeinflussen, das entscheidet der Grafiktreiber. Die genauen Kriterien die dafür erfüllt sein müssen findest du in den entsprechenden Manuals. Grundsätzlich sind das so Dinge wie
- Shader ändert die Fragment-Depth nicht (bzw. nur in konservativer Art, in D3D11 gibts dafür SV_DepthGreater bzw. SV_DepthLessEqual)
- Der Shader verwendet kein clip() oder discard
- Alpha-Testing ist aus
- Der DepthBuffer wurde mit Clear() gelöscht
- ...