Einsteigerguide: Was ist Z-Fighting?
Z-Fighting, auch Stitching genannt, ist ein Phänomen im 3D-Rendering, welches auftritt, wenn zwei oder mehr Primitive ähnliche oder identische Werte im Z-Buffer haben. Es ist besonders häufig bei koplanaren Polygonen anzutreffen, bei denen zwei Flächen im Wesentlichen den gleichen Raum einnehmen, ohne dass eine der beiden Flächen vorne liegt.
Betroffene Pixel werden mit Fragmenten aus einem Polygon oder dem anderen beliebig gerendert, wobei die Genauigkeit des Z-Buffers entscheidend ist. Es kann auch variieren, wenn die Szene oder Kamera gewechselt wird, so dass ein Polygon den Z-Test „gewinnt“, dann ein anderes und so weiter.
Der Gesamteffekt ist eine flackernde, verrauschte Rasterung von zwei Polygonen, die um die Farbe der Bildschirmpixel „fighten“. Dieses Problem wird in der Regel durch begrenzte Subpixelgenauigkeit und Gleitkomma- und Festkomma-Rundungsfehler verursacht.
Je mehr Z-Buffer-Precision man verwendet, desto unwahrscheinlicher ist es, dass es zu einem Z-Fight kommt. Aber bei koplanaren Polygonen ist das Problem unvermeidlich, wenn keine Korrekturmaßnahmen ergriffen werden.
Mit zunehmenden Abstand zwischen nahen und fernen Clip-Ebenen und insbesondere der Auswahl der nahen Ebene in Augenhöhe steigt die Wahrscheinlichkeit, dass es zu einem Z-Fight zwischen Primitiven kommt. Bei großen virtuellen Umgebungen besteht zwangsläufig ein inhärenter Konflikt zwischen der Notwendigkeit, die Sichtbarkeit in der Ferne und im Vordergrund zu lösen, so dass man beispielsweise in einem Raumfahrtsimulator, wenn man eine entfernte Galaxie skaliert, nicht die Präzision hat, die Sichtbarkeit auf einer beliebigen Cockpitgeometrie im Vordergrund zu lösen (obwohl selbst eine numerische Darstellung Probleme vor dem z-gepufferten Rendering darstellen würde). Um diese Probleme zu mildern, wird die Präzision des Z-Buffers in Richtung der nahen Clip-Ebene gewichtet, aber dies ist nicht bei allen Sichtbarkeitsschemata der Fall und es reicht nicht aus, alle Z-Fighting-Probleme zu beseitigen.
Wie kann man dieses Phänomen eindämmen?
Z-Fights können durch den Einsatz eines höher auflösenden Depth Buffers, durch Z-Buffering in einigen Szenarien oder durch einfaches Verschieben der Polygone weiter auseinander reduziert werden. Z-Fights, die nicht vollständig eliminiert werden können, werden auf diese Weise oft durch die Verwendung eines Stencil-Buffers oder durch die Anwendung eines Post Transformation Screen Space Z-Buffers auf ein Polygon gelöst, das die projizierte Form auf dem Bildschirm nicht beeinflusst, aber den Z-Bufferwert, um die Überlappung bei der Pixelinterpolation und dem -vergleich zu beseitigen. Wenn Z-Fighting durch unterschiedliche Transformationspfade in der Hardware für die gleiche Geometrie verursacht wird (z.B. in einem Multi-Pass-Rendering-Schema), kann es manchmal gelöst werden, indem man verlangt, dass die Hardware invariante Vertex-Transformation verwendet.
Z-Fights, die durch unzureichende Präzision im Depth-Buffer verursacht werden, können durch einfache Reduzierung des sichtbaren Abstandes in der Welt gelöst werden. Dies reduziert den Abstand zwischen der nahen und der fernen Ebene und löst das Präzisionsproblem. In bestimmten virtuellen Umgebungen, wie beispielsweise einem Weltraum- oder einem Flugsimulator, ist dies jedoch nicht möglich. In diesen Fällen gibt es alternative Techniken. Eine dieser Techniken ist es, den Abstand von Objekten fernab des Benutzers zu „simulieren“, ohne deren Position tatsächlich zu verändern. Wenn beispielsweise der maximale Sicherheitsabstand (über den hinaus z gekämpft wird) 10.000 Einheiten beträgt und ein zu renderndes Objekt 15.000 Einheiten entfernt ist, könnte dieses Objekt stattdessen bei 10.000 Einheiten gerendert werden, aber proportional zur Entfernung, über die es bewegt wurde, verkleinert werden. Ein um die Hälfte verkleinertes Objekt wird also so aussehen, als wäre es doppelt so weit entfernt wie es tatsächlich ist.
Wenn dies nur für Objekte geschieht, die sich bereits in der Nähe oder in der Nähe des maximalen Betrachtungsabstandes befinden, und Objekte in der Nähe des Benutzers normal wiedergegeben werden, sollte diese Technik nicht auffällig sein. Eine weitere Technik, die verwendet wird, um Z-Fights zu reduzieren oder ganz zu eliminieren, ist der Wechsel zu einem logarithmischen Z-Buffer, der Z umkehrt. Diese Technik ist im Spiel „Grand Theft Auto V“ zu sehen. Aufgrund der Art und Weise, wie sie kodiert werden, haben Gleitkommazahlen eine viel höhere Genauigkeit, wenn sie näher bei 0 liegen. Hier führt das Umkehren von Z zu mehr Präzision beim Speichern der Tiefe von sehr entfernten Objekten, wodurch das Z-Fighting stark reduziert wird.
Damit sind wir mit unserem Beitrag zum Thema „Z-Fighting“ soweit durch. Wenn Sie Anregungen oder Fragen haben sollten, hinterlassen Sie uns unten einen Kommentar.
Vielen Dank für Ihren Besuch.