Polygonsortierung

Hat man nun die sichtbaren Polygone durch Culling ermittelt, stellt sich unwillkürlich die Frage: In welcher Reihenfolge sollen die Polygone, bzw. die Texturen auf den Bildschirm gezeichnet werden? Schließlich können sich Polygone potentiell überdecken und das könnte zu einer fehlerhaften Darstellung führen. Die naive Lösung heißt Polygonsortierung. Wie ein Maler der auf seiner Leinwand erst den Hintergrund komplett zeichnet und dann die Details darüber malt. Deshalb nennt man diesen Algorithmus auch Painter's Algorithm.

Sortieren kann man nach den am weitesten entfernten Punkten oder nach den Punkten, die am nächsten zum Betrachter (Kamera) liegen.

Ein Beispiel:

Painter's Algorithm Beispiel 1

  • Polygon A hat mit Punkt a2 den am weitesten entfernten Punkt
  • Polygon B hat mit Punkt b2 den am weitesten entfernten Punkt
  • Weil a2 vom Betrachter weiter entfernt ist als b2 wird A zuerst gezeichnet, dann B

Leider klappt dieser Lösungsansatz nicht immer:

Painter's Algorithm Beispiel 2

Weil b2 weiter entfernt ist als a2 müßte B zuerst gezeichnet werden und dann A. Dann wird aber B teilweise von A übermalt und das ist falsch!

Genau dieser Sonderfall trat auf, als ich bewegliche Objekte implementierte:

Schiebetüren die sich zur Seite öffen, bewegen sich auf einer parallelen Linie hinter die angrenzende Wand. Beim Start der Translation wurde noch korrekt sortiert. Aber plötzlich wurde zuerst die Wand gerendert und dann die Tür. Sie bewegte sich VOR der Wand, statt dahinter zu verschwinden.

Um diese Problem in den Griff zu bekommen hatte ich verschiedene Sortierkriterien implemetiert und ausgetestet. Leider funktionierten sie nicht in allen Situationen. Im Internet werden einige sehr gute Lösungsansätze beschrieben, die aber allesamt sehr aufwändig zu implementieren sind. Ich mußte mich dann leider von dem Sortieransatz verabschieden und habe stattdessen einen Z-Buffer implementiert.