Z – Buffer Algorithmus


Idee

Die Idee vom Z – Buffer ist relativ einfach zu klären, was auch gleichzeitig der Grund ist, wieso dieses Verfahren standardmäßig von der Graphikhardware unterstützt wird. Da unser Bildschirm aus endlich vielen Pixeln besteht, geben wir nun jedem Pixel neben seiner Farbe noch ein zusätzliches Attribut. Dieses ist die Tiefeninformation von der letzten Schreiboperation, die auf diesem Pixel stattfand, also genau die Tiefeninformation von einem Punkt eines Objektes, die diesen Pixel erzeugt hat bzw. ihm eine Farbe zugewiesen hat.

Rendern wir nun z.B das nächste Objekt bzw. rastern dessen Dreiecke und stellen dabei fest, dass wir genau diesen Pixel nun mit der Farbe des neues Objekts ausfüllen wollen, so schauen wir uns den Tiefenwert vom alten, bereits beschriebenen Pixel, und dem vom neuen Punkt an, der diesen Pixel schreiben will. Ist der neue Tiefenwert kleiner, so liegt der Punkt des neuen Objekts vor dem des alten Objekts, was wiederum dazu führt, dass wir dem Pixel nun eine neue Farbe zuweisen und seine Tiefeninformation aktualisieren.

Der Z – Buffer Algorithmus im Pseudocode:




Den Schnittpunkt berechnen wir durch Interpolation (siehe Abschnitt Interpolation in Dreiecken und Gradienten), da wir ja an den Eckpunkten der Dreiecke die Tiefenwerte gespeichert haben.

Lineare Interpolation unter perspektivischer Projektion

Oft fällt in vielen Quellen, sei es Internet, Büchern oder Skripten aus dem Universitätsbereich, der Begriff lineare Interpolation des Tiefenwertes, wenn es um den Z – Buffer Algorithmus geht. Dabei ist die lineare Interpolation des Tiefenwertes aber eigentlich nur unter besonderen Umständen möglich und erzeugt bei perspektivischer Projektion falsche Ergebnisse ! Den Grund werden wir später erläutern, wenn wir das perspektivische Texturemapping erklären.

Wieso schreiben wir jetzt dann aber eigentlich was von linearer Interpolation, wenn diese Falsch ist ? Der Grund, wieso wir linear Interpolieren dürfen liegt an unser Projektionsmatrix von der Kamera, die das Viewfrustum in einen Einheitswürfel „presst“.

Z -Fighting

Da wir zwar im Einheitswürfel linear interpolieren können, heißt dass noch lange nicht, dass das Ergebnis richtig ist. Was auf den Einheitswürfel abgebildet wird bestimmt nämlich die Near- und Farplane. Je größer der Abstand von Near- und Farplane ist, desto mehr Raum wird in den Einheitswürfel abgebildet, was nun dazu führt, dass die Objekte zu dicht aufeinander „gepresst“ werden und sich Anfangen zu überlagern. Diesen Effekt kann man zudem noch verschlimmern, wenn man die Nearplane zu dicht an die Kameraposition setzt. Dieses hat zur Folge, dass die Tiefenauflösung in der Ferne sehr stark abfällt und es zu Artefaktbildung, ähnlich wie beim Texturemapping kommt. Rendert man nun diese Objekte jedes mal in beliebiger Reihenfolgen, so tritt evtl. neben der Artefaktbildung, der Effekt vom Z-Fighting auf. Hier überschneiden sich nun Objekte im Raum und bekommen den selben Tiefenwert an einigen Punkte zugeordnet. Alterniert nur die Reihenfolge der zu rendernen Objekte, so ist mal der Punkt von einem Objekt, mal der Punkt vom anderen Objekt zu sehen, was sich in einem Flackern bemerkbar macht.

Index