Tiefenpuffer

Ein Tiefenpuffer oder Z-Puffer speichert Tiefeninformationen, um zu steuern, welche Polygonbereiche gerendert und nicht ausgeblendet werden.

Übersicht

Ein Tiefenpuffer, der häufig als Z-Puffer oder w-Puffer bezeichnet wird, ist eine Eigenschaft des Geräts, das Tiefeninformationen speichert, die von Direct3D verwendet werden. Wenn Direct3D eine Szene auf einer Zieloberfläche rendert, kann der Speicher in einer zugeordneten Tiefenpufferoberfläche als Arbeitsbereich verwendet werden, um zu bestimmen, wie die Pixel gerasterter Polygone einander verdecken. Direct3D verwendet eine Direct3D-Oberfläche außerhalb des Bildschirms als Ziel, auf das die endgültigen Farbwerte geschrieben werden. Die Tiefenpufferoberfläche, die der Renderzieloberfläche zugeordnet ist, wird verwendet, um Tiefeninformationen zu speichern, die Direct3D angibt, wie tief die einzelnen sichtbaren Pixel in der Szene sind.

Wenn eine Szene mit aktivierter Tiefenpufferung gerastert wird, wird jeder Punkt auf der Renderingoberfläche getestet. Die Werte im Tiefenpuffer können die Z-Koordinate eines Punkts oder seine homogene w-Koordinate sein – von der Position des Punkts (x,y,z,w) im Projektionsraum. Ein Tiefenpuffer, der z-Werte verwendet, wird häufig als Z-Puffer bezeichnet, und einer, der w-Werte verwendet, wird als w-Puffer bezeichnet. Jeder Typ von Tiefenpuffer hat Vor- und Nachteile, die später erläutert werden.

Zu Beginn des Tests wird der Tiefenwert im Tiefenpuffer auf den größtmöglichen Wert für die Szene festgelegt. Der Farbwert auf der Renderingoberfläche wird entweder auf den Wert der Hintergrundfarbe oder den Farbwert der Hintergrundtextur zu diesem Zeitpunkt festgelegt. Jedes Polygon in der Szene wird getestet, um festzustellen, ob es sich mit der aktuellen Koordinate (x,y) auf der Renderingoberfläche überschneidet.

Wenn sie sich überschneiden, wird der Tiefenwert ( d. h. die z-Koordinate in einem z-Puffer und die w-Koordinate in einem w-Puffer ) am aktuellen Punkt getestet, um festzustellen, ob er kleiner als der im Tiefenpuffer gespeicherte Tiefenwert ist. Wenn die Tiefe des Polygonwerts kleiner ist, wird er im Tiefenpuffer gespeichert, und der Farbwert aus dem Polygon wird an den aktuellen Punkt auf der Renderingoberfläche geschrieben. Wenn der Tiefenwert des Polygons an diesem Punkt größer ist, wird das nächste Polygon in der Liste getestet. Dieser Vorgang wird im folgenden Diagramm dargestellt.

Diagramm der Testtiefewerte

Puffertechniken

Obwohl die meisten Anwendungen dieses Feature nicht verwenden, können Sie den Vergleich ändern, den Direct3D verwendet, um zu bestimmen, welche Werte im Tiefenpuffer und anschließend auf der Renderzieloberfläche platziert werden. Auf einigen Hardwarefunktionen kann das Ändern der Vergleichsfunktion hierarchische Z-Tests deaktivieren.

Fast alle Beschleuniger auf dem Markt unterstützen Z-Pufferung, sodass Z-Puffer heute die gängigste Art von Tiefenpuffer sind. Wie allgegenwärtig auch immer, Z-Puffer haben ihre Nachteile. Aufgrund der betreffenden Mathematik werden die generierten z-Werte in einem Z-Puffer tendenziell nicht gleichmäßig über den Z-Pufferbereich verteilt (in der Regel 0,0 bis 1,0, einschließlich).

Insbesondere wirkt sich das Verhältnis zwischen der fernen und der nahen Clippingebene stark auf die ungleichmäßige Verteilung der z-Werte aus. Bei verwendung eines Abstandsverhältnisses auf der fernen Ebene zu einer nahezu ebenen Entfernung von 100 werden 90 Prozent des Tiefenpufferbereichs für die ersten 10 Prozent des Szenentiefenbereichs aufgewendet. Typische Anwendungen für Unterhaltungs- oder visuelle Simulationen mit Außenszenen erfordern häufig Weit-/Nahebenenverhältnisse zwischen 1.000 und 10.000. Bei einem Verhältnis von 1.000 werden 98 Prozent des Bereichs für die ersten 2 Prozent des Tiefenbereichs aufgewendet, und die Verteilung wird mit höheren Quoten schlechter. Dies kann zu ausgeblendeten Oberflächenartefakten in entfernten Objekten führen, insbesondere bei Verwendung von 16-Bit-Tiefenpuffern, der am häufigsten unterstützten Bittiefe.

Ein w-basierter Tiefenpuffer hingegen ist häufig gleichmäßiger auf die nah- und fernen Clipebene verteilt als ein Z-Puffer. Der Hauptvorteil besteht darin, dass das Verhältnis der Entfernungen für die entfernten und nahen Clippingebenen kein Problem mehr ist. Auf diese Weise können Anwendungen große maximale Bereiche unterstützen und gleichzeitig eine relativ genaue Tiefenpufferung in der Nähe des Augenpunkts erhalten. Ein w-basierter Tiefenpuffer ist nicht perfekt und kann manchmal versteckte Oberflächenartefakte für objekte in der Nähe aufweisen. Ein weiterer Nachteil des w-buffered-Ansatzes ist die Hardwareunterstützung: W-Pufferung wird in Hardware nicht so häufig unterstützt wie Z-Pufferung.

Die Verwendung eines Z-Puffers erfordert mehr Aufwand beim Rendern. Bei Verwendung von Z-Puffern können verschiedene Techniken verwendet werden, um das Rendering zu optimieren. Anwendungen können die Leistung steigern, wenn Z-Pufferung und Texturierung verwendet werden, indem sie sicherstellen, dass Szenen von vorne nach hinten gerendert werden. Texturierte z-gepufferte Grundtypen werden mit dem Z-Puffer auf Scanzeilenbasis vorab getestet. Wenn eine Scanlinie von einem zuvor gerenderten Polygon ausgeblendet wird, lehnt das System sie schnell und effizient ab. Die Z-Pufferung kann die Leistung verbessern, aber die Technik ist am nützlichsten, wenn eine Szene die gleichen Pixel mehr als einmal zeichnet. Dies ist schwierig, genau zu berechnen, aber Sie können oft eine genaue Näherung vornehmen. Wenn die gleichen Pixel weniger als zweimal gezeichnet werden, können Sie die beste Leistung erzielen, indem Sie die Z-Pufferung deaktivieren und die Szene von hinten nach vorne rendern.

Die tatsächliche Interpretation eines Tiefenwerts ist spezifisch für den Renderer.

Tiefen- und Schablonenpuffer