Registriert: Mo Mai 27, 2002 16:29 Beiträge: 77 Wohnort: Düsseldorf
Hallo
In meinem aktuellen Programm habe ich zwei Dreiecke, die exakt auf der selben Ebene liegen und sich gegenseitig überlappen, wenn ich sie jetzt auf der Ebene verschiebe, sieht man abwechselnd Stücke von ersten und Stücke vom zweiten Polygon, so dass sie flackern.
Je genauer der Z-Buffer ist, desto schlimmer wird es, wenn ich also einen 8 Bit Buffer und eine Near-Clip-Plane < 0.1 nehme, flackert es fast gar nicht, aber in der Entfernung könnten ab und zu Polygone vertauscht werden. Gibt es noch ne andere Möglichkeit das Flackern zu verhindern?
Du kannst z.B. Alpha- oder Stenciltests verwenden, wenn du die "z-Reihenfolge" von koplanaren Polygonen kennst.
Alternativ kannst du auch mit glPolygonOffset arbeiten, da dies "garantieren" sollte, dass die Z-Auflösung berücksichtigt wird - meine eigene Erfahrung zeigt aber, dass man sich darauf nicht unbedingt verlassen kann (vor allem nicht auf Mainstreamgrafikkarten ohne sauber programmierte OpenGL Treiber) - weshalb du eventuell besser dran bist, wenn du ein Polygon selbst ein wenig nach "hinten" schiebst.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Schau dir mal die Funktion glPolygonOffset an, mit der man Polygone um einen bestimmten Faktor versetzt rendern kann. Also Dreieck 1 rendern, Polygon-Offset setzen und aktivieren und dann Dreieck 2 zeichnen. Der Offsetfaktor sollte dabei entsprechend der Z-Position variiert werden.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du kannst das entweder durch umstellen deines Z-Buffers lösen oder du stellst als DepthFunc GL_LEQUAL ein. Damit werden bei Polygonen die sich auf gleicher höhe befinden das zu letzt gezeichnete bevorzugt.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
vom PolygonOffset kann ich nur abraten. Ich habe das in dem einen Projekt auch eingesetzt und festgestellt, dass es von so ziemlich jeder Karte anders Interpretiert wird. Abgesehen davon ist PolygonOffset ein globaler Statechange.
@Alpha/Stencil
ja, das erste Polygon zeichnet sich zusätzlich zum ColorBuffer auch noch in den Stencilbuffer, Stenciltest ist so gelegt, dass bei gesetztem Stencilbit nicht gezeichnet wird - damit bleibt das erste Polygon im Vordergrund - Nachteil ist, dass man zur Laufzeit den Stencilmodus wechseln muss.
@Z-Buffer
mit glDepthFunc kannst du diverse Modi des DepthTest wählen (z.B. GL_LEQUAL anstelle von GL_LESS) - bei Z-Fighting Problemen hilft das aber nur bedingt
@Polygon Offset
je nach Grafiktreiber kann der Befehl auch gar keine Auswirkung haben - normalerweise nimmt man ihn dazu her, um Linien und gefüllte Flächen separat zeichnen zu können, ohne dass man dazu die Geometrie verschieben muss.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du hattest gesagt, dass du einen 8 Bit zBuffer verwendest. Das finde ich ein wenig klein. Aber wenn ich noch mal so direkt darüber nachdenke (war vorhin ein wenig in Eile) dann sollte es rein gar nichts bringen wenn du etwas am ZBuffer änders. Sobald die beiden Flächen direkt übereinander liegen ist es purer Zufall welche davon bevorzugt wird. Und da musst du schon etwas am verhalten ändern. Also glPolygonOffset oder glDepthFunc. Auf Arbeit hatte ich das Problem, dass ich ein Surface habe und genau darüber ein Gitternetz. Also die Kanten der Flächen. Und zu erst hatte ich es mit glPolygonOffset gemacht. Nur das beeinflusst nicht nur die Kanten. Sondern alles was an Linien da war. Abgesehen davon, dass wirklich JEDE Grafikkarte das anders interpretiert. Letzten endes habe ich es dann mit einer anderen Depthfunc gelöst. GL_LEQUAL. Die erlaubt Flächen die einen kleineren oder gleichen ZWert haben. Somit ist das Verhalten wie normal aber für den Fall, dass zwei Flächen übereinander liegen wird immer die Letzte genommen.
Mitglieder in diesem Forum: Bing [Bot], Google [Bot] und 19 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.