Tiefenpuffer (Direct3D 9)

Ein Tiefenpuffer, häufig als z-Puffer oder w-Puffer bezeichnet, ist eine Eigenschaft des Geräts, die 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 aktiviertem Tiefenpuffer 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 ist entweder auf den Hintergrundfarbwert oder den Farbwert der Hintergrundtextur 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 dies der Fall ist, wird der Tiefenwert - bei dem es sich um die z-Koordinate in einem z-Puffer und die w-Koordinate in einem w-Puffer handelt - 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 Prozess wird im folgenden Diagramm dargestellt.

Diagramm der Testtiefewerte

Hinweis

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 in der Renderzieloberfläche platziert werden. Ändern Sie dazu den Wert für den D3DRS_ZFUNC Renderzustand. Auf einer Hardware kann das Ändern der Vergleichsfunktion hierarchische z-Tests deaktivieren.

 

Fast alle Accelerators auf dem Markt unterstützen Z-Puffer, sodass Z-Puffer heute der häufigste Typ von Tiefenpuffern sind. Die allgegenwärtigen Z-Puffer haben jedoch ihre Nachteile. Aufgrund der beteiligten Mathematik werden die generierten z-Werte in einem z-Puffer in der Regel 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 Abschneideebene stark auf die ungleichmäßige Verteilung der z-Werte aus. Bei verwendung eines Abstandsverhältnisses von 100 zur nahebenen Entfernung werden 90 Prozent des Tiefenpufferbereichs für die ersten 10 Prozent des Szenentiefenbereichs ausgegeben. Typische Anwendungen für Unterhaltungs- oder visuelle Simulationen mit Außenszenen erfordern häufig Verhä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 ausgegeben, 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 ist dagegen 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 fernen und nahen Abschneideebenen kein Problem mehr ist. Dadurch können Anwendungen große maximale Reichweiten unterstützen und gleichzeitig relativ genaue Tiefenpuffer in der Nähe des Augenpunkts erhalten. Ein w-basierter Tiefenpuffer ist nicht perfekt und kann manchmal versteckte Oberflächenartefakte für nahe Objekte aufweisen. Ein weiterer Nachteil des w-buffered-Ansatzes ist die Hardwareunterstützung: W-Pufferung wird in der Hardware nicht so stark unterstützt wie Z-Puffering.

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. Ausführliche Informationen finden Sie unter Leistung des Z-Puffers.

Hinweis

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

 

In diesem Abschnitt werden Informationen zur Verwendung von Tiefenpuffern zum Entfernen ausgeblendeter Linien und ausgeblendeter Oberflächen vorgestellt.

Direct3D-Rendering