prev up inhalt next


17.2.1 z-Buffer-Algorithmus

Der hier vorgestellte z-Buffer-Algorithmus löst das Problem nach dem folgenden Prinzip: Für alle Pixel des Bildschirms wird die z -Komponente als Wert für die Tiefe im Raum gespeichert. Die benötigte Datenstruktur, der sogenannte z-Buffer, ist im Programm ein 2-dimensionales Array, das für jedes Pixel den z -Wert des in diesem Punkt dem Betrachter am nächsten liegenden Objekts enthält. In einem gleichgroßen Feld, dem Frame Buffer, werden die Farbwerte der Pixel gespeichert. Die Menge der Farbwerte stellt den Bildschirmspeicher dar.

Der z -Wert wird mit Null und der Farbwert mit der Hintergrundfarbe der Szene initialisiert.

Laut Definition der Transformationspipeline treten nach dem Clipping im NPC nur noch z -Werte zwischen Null und Eins auf. Die Initialisierung mit Null entspricht dem größtmöglichen Abstand vom Betrachter (back plane).

Durch die Rasterung der Flächen erhalten die Pixel auch einen interpolierten z -Wert, der mit dem z-Buffer-Wert an dieser Stelle verglichen wird. Ist der z -Wert des Pixels größer, so ist das Pixel (vorläufig) sichtbar. Sein z -Wert wird in den z-Buffer und sein Farbwert in den Bildschirmspeicher eingetragen. Ist der z -Wert des Pixels kleiner, so ist der zugehörige Teil der Fläche verdeckt; die Inhalte von z-Buffer und Bildschirmspeicher bleiben erhalten. Nach der Abarbeitung aller Flächen enthält der Bildschirmspeicher die Abbildung der sichtbaren Flächen bzw. Flächenteile und der z-Buffer die zugehörige Tiefeninformation.

Der z-Buffer-Algorithmus entscheidet pixelweise über die Verdeckungseigenschaften und ist daher sehr allgemeingültig. Die darzustellenden ebenen Flächen brauchen nicht vorsortiert zu werden und dürfen sich gegenseitig durchdringen. Da er am Ende der Transformationspipeline im DC arbeitet, wird er als Bildraumalgorithmus klassifiziert.

Der z-Buffer-Algorithmus wird vom Programm in der inneren Schleife des Scanline-Algorithmus aufgerufen und läßt sich wie folgt skizzieren:

    Fuer jede Flaeche F tue:
      Fuer jedes Pixel (x, y) auf dieser Flaeche tue:
        berechne Farbe c und Tiefe z
        falls z > tiefe[x, y]:
          dann wird c an der Stelle x,y im Frame Buffer eingetragen
          und tiefe[x, y] auf z gesetzt.

Ist die Fläche durch Ax + By + Cz + D = 0 gegeben, so ist die Tiefe im Punkt (x,y) :

Für auf einer Scanline benachbarte Punkte (xi,yj) und (xi + 1,yj) ergibt sich

Für die Punkte (xi,yj) und (xi,yj + 1) zweier benachbarter Scanlines ergibt sich

Das größte Problem bei der Implementierung des z-Buffers ist sein Speicherplatzbedarf. Eine ausreichende Auflösung der Tiefeninformation ergibt sich erst mit einem 32-Bit z -Wert, d.h. maxint = (231 - 1) . Für die RGB-Tripel werden drei Byte benötigt, die in einem 32-Bit Integer kodiert werden. Pro Pixel belegen der z-Buffer und der Bildschirmspeicher also acht Byte. Bei einer Bildschirmauflösung von 800 × 600 Pixeln ergeben sich folglich 3,84 MB.


prev up inhalt next