Beim Rendern von zwei sich überlappenden koplanaren Oberflächen tritt häufig das Problem "Z-Fighting" auf, bei dem der Renderer nicht entscheiden kann, welche der beiden Oberflächen sich näher an der Kamera befindet. Dadurch entstehen visuelle Artefakte im Überlappungsbereich.
Die Standardlösung besteht darin, den Oberflächen beim Entwerfen des Modells einen leichten Versatz zu geben. Gibt es eine andere Lösung?
Antworten:
Wenn die Oberflächen exakt koplaner sind, liegt Ihr Schicksal bei den FPU-Göttern. Sie werden höchstwahrscheinlich Z-Kämpfe haben. Wenn die Dreiecke sind identisch , und Sie tun , um die genaue gleiche Mathematik zu jeder, Sie werden mit den gleichen Z-Werte für beide am Ende. Aber auch dies wird nur passieren, wenn Ihre mathematischen Operationen für beide identisch sind. (Da FPU-Operationen im Allgemeinen nicht kommutativ sind)
Eine mögliche Lösung besteht darin, den Z-Puffer überhaupt nicht zu verwenden. Sie können stattdessen den Algorithmus des Malers verwenden . Zugegeben, damit sind auch alle Probleme des Maleralgorithmus verbunden. Aber es würde den Z-Kampf lösen.
In Ihrem Beispielfall von SSDs (Screen Space Decals) besteht die häufigste Lösung in der Verwendung eines Versatzes, auch bekannt als einfacher dünner Würfel. Weitere Informationen finden Sie in der Präsentation von Warhammer 40k zu SSDs. Oder Bart Wronskis Post, der einige andere Probleme mit Abziehbildern behandelt, aber auch Links zu einigen anderen Präsentationen über SSDs enthält
quelle
So habe ich das in der Vergangenheit gelöst:
Beachten Sie, dass die Objekte nacheinander gezeichnet werden müssen, damit dies funktioniert.
quelle
Abhängig von Ihrem Renderer können Sie die Oberflächen mit einem rauschähnlichen Algorithmus "verschwommener" machen, indem Sie einen winzigen Versatz in der Multisampling-Tiefe anwenden. Dies sollte zu einer Art Mischeffekt für Oberflächen in unmittelbarer Nähe der Tiefe führen. Soweit ich weiß, ist die Einstellung der Sample-Tiefe in Fragment Shader in OpenGL relativ neu und nur als Erweiterung.
OpenGL verfügt über das PolygonOffset, es muss jedoch im Voraus bekannt sein, dass Sie im Begriff sind, etwas koplanar zu rendern. Obwohl es für Flächen innerhalb eines einzelnen Modells nicht machbar ist, kann es beispielsweise gut funktionieren, wenn eine Straße auf einem Grundstück überlagert wird.
quelle