Alle Techniken, die Raytracing im Fragment-Shader beinhalten, möchten möglicherweise Z schreiben, damit der Tiefenpuffer eine genaue Darstellung der Raytraced-Oberfläche enthält. Zum Beispiel:
- Distanzfeldstrahlmarsch , wie in vielen Shadertoys und Demoszenenproduktionen zu sehen. Hier wird nur ein Quad im Vollbildmodus gerastert, und die gesamte Geometrie wird vom Fragment-Shader generiert. Das Schreiben von Z ist erforderlich, wenn Sie den Tiefenpuffer für verzögerte Beleuchtung oder Nachwirkungen verwenden oder Entfernungsfelder mit gewöhnlicher Dreiecksgeometrie zusammensetzen und eine korrekte Okklusion erzielen möchten.
- Voxelstrahl marschieren, ähnlich wie oben. Selbst wenn die Voxel durchscheinend sind (wie in einer Rauchwolke oder dergleichen), kann es nützlich sein, Z zu schreiben, wenn die Voxeldichte hoch genug ist, um undurchsichtig zu werden; Dies kann beispielsweise für spätere Berechnungen von Bewegungsunschärfe / Schärfentiefe nützlich sein.
- Parallaxen-Okklusions-Mapping- Techniken, bei denen eine flache Oberfläche durch Strahlenmarschieren gegen ein Höhenfeld das Aussehen von Tiefe erhält.
Es gibt wahrscheinlich andere ähnliche Fälle, in denen die Form einer Oberfläche eher durch den Fragment-Shader als durch die gerasterten Dreiecke definiert wird.
Übrigens unterstützen neuere APIs und GPUs einen konservativen Tiefenausgabemodus , in dem das vom Shader geschriebene Z nur größer als das geometrische Z sein darf, nicht jedoch kleiner. Auf diese Weise können Early-Z / Hierarchical-Z-Optimierungen weiterhin basierend auf dem geometrischen Z ausgeführt werden: Wenn die gerasterte Geometrie für etwas ausgewählt wird, wissen Sie, dass das vom Shader geschriebene Z ebenfalls ausgewählt wurde. Dies ist eine gute Lösung für Fälle wie die oben genannten, da Sie eine Begrenzungsgeometrie für das Objekt Distanzfeld / Voxel / Höhenfeld rastern können. dann ist die tatsächliche Tiefe größer als die der Begrenzungsgeometrie.