Ich kann nicht wirklich herausfinden, warum eine Oberfläche eine andere überlappt. In einer 3D-Engine, die ich erstelle, schlägt meine Technik in Randfällen fehl.
Meine Methode besteht darin, die zu lackierenden Flächen vom weitesten zum nächsten zu sortieren. Um die Nähe zu bestimmen, vergleiche ich die durchschnittlichen z-Werte. Manchmal hat eine überlappende Oberfläche jedoch einen höheren durchschnittlichen z-Wert als die überlappende. So wird die weiter entfernte Oberfläche über die nähere gestrichen - was zu einer bizarren Darstellung wie folgt führt:
Was man sehen soll, ist nur die lila Vorderseite des Würfels, während die rote Seitenfläche über die lila gemalt ist. Der durchschnittliche z-Wert der violetten Oberfläche ist höher und daher "weiter entfernt". Ich habe also Zweifel, ob diese Technik korrekt ist.
Was ich auch versucht habe, ist die Entfernung von der Kamera (dh dem Ursprung) zur Oberfläche, aber dann brauchte ich einen Punkt. Ich habe die Mitte jeder Oberfläche gewählt, aber auch dies scheint nicht immer zu funktionieren, da nicht alle Oberflächen so groß wie die anderen sind.
Was ist daher ein zuverlässiger Weg, um die Reihenfolge der Nähe von Oberflächen zum Ursprung zu bestimmen?
Was Sie haben, ist ein Sichtbarkeitsproblem . Eine Lösung ist die Verwendung eines Z-Puffers .
quelle
Das Sortieren der Flächen nach ihrem durchschnittlichen Z-Wert funktioniert nicht, da der durchschnittliche Z-Wert keine Informationen über den tatsächlichen Z-Wert der Scheitelpunkte oder sogar Oberflächenpixel liefert.
Beispiel (Warnung, ASCII-Grafik voraus):
Es gibt zwei Gesichter A und B. Aus Sicht der Kamera liegt A vor B. Der durchschnittliche z-Wert von B ist jedoch kleiner. Schauen wir uns die anderen Z-Werte an:
Sie könnten versuchen, sie nach ihren minimalen Z-Werten zu sortieren, aber es gibt Fälle, in denen dies auch nicht funktioniert. Es gibt einfach keine Möglichkeit, beliebige Flächen mit nur einem Z-Wert korrekt zu sortieren.
In Newells Algorithmus http://en.wikipedia.org/wiki/Newell 's_algorithm sortieren Sie die Min / Max-Bereiche der Z-Werte. Wenn sich die Bereiche zweier Flächen nicht überlappen, können Sie sicher wissen, welche vorne liegt. Wenn ja, müssen Sie manchmal unbedingt die Gesichter teilen. Manchmal reicht es aus, jeden Scheitelpunkt für die Okklusion oder eine andere Technik zu strahlen.
quelle
Es ist gut, dass Sie etwas über das Rendern lernen. Ein großes Lob. In diesem Fall gibt es keine "Maleralgorithmus" -Lösung, anstatt zu versuchen, sie durch Sortieren zu beheben. Auf der PS1 haben wir nur versucht, Polygone ungefähr gleich groß zu halten, wenn sie nebeneinander waren (wie Sie es tun) soweit ich das beurteilen kann) und backface cull (was du nicht tust)
Beim Backface-Culling wird die Oberflächennormale im Bildschirmbereich auf ihre Richtung überprüft (erhalten Sie einfach das Vorzeichen des Tiefenelements aus dem normal transformierten Bildschirmbereich (in unserem Fall das z der Normalen) oder das Kreuzprodukt zweier Vektoren der Dreieck dh Kreuz (v1-v0, v2-v0))
Wenn Sie Backface-Culling implementieren, reduzieren Sie auch das Rastering, das Sie durchführen. Double Win.
quelle