Z-Fighting-Lösungen im Tiefentest in OpenGL - wie funktionieren sie?

Beschreibung

Ich hatte große Probleme mit Z-Fighting in OpenGL und habe einige Zeit damit verbracht, Lösungen für dieses Problem zu finden. Einige von denen, die ich gefunden habe und die ich verstehe und die ich nicht mochte:

Polygone voneinander entfernen (wie glPolygonOffset in OpenGL)Unterteilen der Szene nach Z-Koordinaten und Zeichnen von Teilen der Szene mit separaten sauberen Z-Puffern.

Die ich nicht verstehe:

Verwenden der Projektionsmatrixhttps://software.intel.com/de-de/articles/alternatives-to-using-z-bias-to-fix-z-fighting-issuesVerwenden von "Logarithmischen Tiefenpuffern"http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html

Ich habe die zweite in meinem Programm implementiert, indem ich sie einfach in den Vertex-Shader einer Kugel geschrieben habe (sie hat mit dem Boden gekämpft):

float C = 1.0; 
float far = 2000.0; 
   gl_Position = u_projView * a_position;      
gl_Position.z = 2.0*log(gl_Position.w*C + 1.0)/log(far*C + 1.0) - 1.0;
gl_Position.z *= gl_Position.w;

und es hat funktioniert!

Aktuelle FragenKann mir jemand erklären, wie das Ändern der Z-Koordinate des Scheitelpunkts im Scheitelpunkt-Shader das Problem gelöst hat, OHNE den Scheitelpunkt sichtbar zu mir zu bewegen? (Die Szene sieht für das menschliche Auge gleich aus.) Wie hat sich die Verteilung der Z-Tiefenwerte geändert? Ich vermute, mir fehlen einige Kenntnisse über das Rendern von Pipelines.Kann mir jemand erklären, wie wir das nutzen könnenProjektionsmatrix um das Problem zu lösen ? Und wie funktioniert es?Gibt es andere, ähnlich wirksame Möglichkeiten, um das Z-Fighting-Problem zu beheben?

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage