Woher kommen Pixel-Lücken in OpenGL?

8

Das Problem, das ich habe, ist, dass es in meiner gerenderten Szene einige Pixel gibt die scheinen zu fehlen / unsichtbar und haben daher die gleiche Farbe wie meine Clear Farbe. Interessanterweise passiert dies nur, wenn MSAA ausgeschaltet ist.

Mein erster Gedanke war, dass es etwas damit zu tun haben könnte, dass alle Dreiecke sich überlappen und irgendwie durch die Projektionsmatrix verzerrt sind, aber diese Artefakte scheinen nur auf Linien und nicht auf Kanten zu entstehen.

Ich habe gelesen, dass ich nur eine Skala von 1.00001 auf alles in einer anderen Frage anwende, aber das scheint mir ein billiger Hack zu sein, der andere Probleme verursachen könnte. Obwohl diese Artefakte bei Verwendung von Hardware-Multisampling reduziert scheinen, möchte ich wissen, ob es andere Möglichkeiten gibt, dies zu beheben.

Bearbeiten:

  

Ein Weg, dies zu lösen, durch Nicol Bolas :

     
    

OpenGL (und alle anderen Hardware-Rasterizer) garantiert nur ein lückenloses Rendern der Kante zwischen zwei Dreiecken, wenn die Kanten genau übereinstimmen. Und das bedeutet, dass Sie nicht nur ein Dreieck neben dem Rand eines anderen haben können. Die zwei Dreiecke müssen identische Ecken auf der gemeinsamen Kante zwischen ihnen haben.

         

Wenn Sie also ein langes Dreieck neben einem kurzen Dreieck haben, müssen Sie das lange Dreieck in mehrere Dreiecke teilen, damit der gemeinsame Teil der Kante richtig zwischen zwei Dreiecken aufgeteilt wird.

  

Wie gesagt, besteht eine mögliche Lösung darin, die großen Dreiecke in kleine Dreiecke aufzuteilen, um sicherzustellen, dass alle überlappenden Vertices identisch sind (d. h. die gierige Vermaschung wird abgeschafft). Aber in meinem Fall möchte ich die gierige Vernetzung aufgrund von Leistungsaspekten beibehalten.

    
obsilp 10.10.2016, 12:12
quelle

4 Antworten

7

OpenGL (und alle anderen Hardware-Rasterizer) garantiert nur ein lückenloses Rendern der Kante zwischen zwei Dreiecken, wenn die Kanten genau übereinstimmen. Und das bedeutet, dass Sie nicht nur ein Dreieck neben dem Rand eines anderen haben können. Die zwei Dreiecke müssen identische Ecken auf der gemeinsamen Kante zwischen ihnen haben.

Wenn Sie also ein langes Dreieck neben einem kurzen Dreieck haben, müssen Sie das lange Dreieck in mehrere Dreiecke teilen, damit der gemeinsame Teil der Kante richtig zwischen zwei Dreiecken aufgeteilt wird.

Da Sie scheinbar eine Welt aus Würfeln bauen, sollte das für Sie ziemlich einfach sein.

Die andere Sache, die Sie tun müssen, ist sicherzustellen, dass die zwei geteilten Scheitelpunkte zwischen den zwei Dreiecken binär identisch sind. Die gl_Position -Ausgabe vom Vertex-Shader muss genau derselbe Wert sein. Wenn Sie also die Position der Scheitelpunkte des Würfels im VS berechnen, müssen Sie dies auf eine Weise tun, die binäre identische Ergebnisse garantiert.

  

Aber in meinem Fall möchte ich das gierige Ineinandergreifen wegen der Leistungsaspekte behalten.

Dann müssen Sie entscheiden, was wichtiger ist: Leistung oder Korrektheit . Da es keine Möglichkeit gibt, den Rasterizer forcieren zu aktivieren, können solche Kanten lückenlos sein. Es ist eine Frage der Gleitkommapräzision und dergleichen, die auf unterschiedlicher Hardware immer unterschiedlich sein wird.

    
Nicol Bolas 10.10.2016, 14:45
quelle
2

Es heißt "Stitching". Der Rasterizer stimmt nicht exakt mit den Dreiecken überein und einige Pixel fehlen. Andere haben erklärt, wie man die Dreiecke so einrichtet, dass OpenGL weiß, dass sie teilen und kanten. Da Ihre Modellbau-Logik immer komplizierter wird, ist es manchmal schwierig, Stiche zu vermeiden. Die Problemumgehung besteht darin, zu schwarz oder dunkelgrau zu löschen, und die Stiche sind dann fast unsichtbar.

    
Malcolm McLean 10.10.2016 14:59
quelle
1

Dies liegt daran, dass es ein Problem gibt, dass zwei Polygone die Kanten berühren, und da es sich um einen kleinen Fehler handelt. (höchstwahrscheinlich Rundungsfehler in den Gleitkommaeinheiten, die verwendet werden, um die Kante zu schätzen) Es sollte theoretisch auch Zeiten geben, in denen sie ihre Kanten überlappen, aber dies wäre viel weniger wahrnehmbar. Wenn Sie einen sehr kleinen Vergrößerungsfaktor einstellen oder einfach nur die Polygone selbst bewegen, sollte das Problem gelöst werden. Der Grund, warum es nur auftritt, wenn MSAA ausgeschaltet ist, wie es im Allgemeinen helfen würde, diese Art von Problem zu verhindern. (Dies liegt daran, dass alle Berechnungen mit einer höheren Auflösung ausgeführt werden, aber dann wird alles auf eine niedrigere Auflösung herunterskaliert, so dass es nicht so auffällt. Das Problem tritt tatsächlich immer noch auf, aber wegen der Herunterskalierung werden die fehlenden Pixel verschwinden, wenn sie in die umgebenden Pixel eingeblendet werden.)

    
Chris Britt 10.10.2016 13:05
quelle
-2

Dies wird auch als Z-Fighting bekannt.

Ссылка

Es passiert, wenn 2 Scheitelpunkte / Polygone genau den Abstand von der Betrachtungsposition einnehmen. Wenn die GPU dies auflöst, kann ein Gleitkommafehler auftreten, und es kann sich verwirren, welcher Knoten die Präsidentschaft übernimmt (was macht man? Sie entscheiden!). Dies kann durch Verwendung einer besseren Grafikkarte (CAD-Karten können diese Probleme besser lösen) und ein wenig mehr Intelligenz über das Zeichnen der Polys (vielleicht Tiefenprüfung der Polys zu ziehen, so dass Sie sicherstellen können, welche Poly vor was ist) überwunden werden da dies der Karte helfen kann, es richtig zu zeichnen. Die Präzision der Hardware wird sie jedoch letztendlich begrenzen und diese Artefakte erzeugen.

    
lfgtm 10.10.2016 13:44
quelle

Tags und Links