Freigeben über


Tiefenpuffer

Ein Tiefenpuffer oder Z-Puffer speichert Tiefeninformationen, um zu steuern, welche Polygonbereiche gerendert werden, anstatt aus der Ansicht ausgeblendet zu 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 sie den Speicher in einer zugeordneten Tiefenpufferoberfläche als Arbeitsbereich verwenden, um zu bestimmen, wie die Pixel gerasterter Polygone einander verdecken. Direct3D verwendet eine Direct3D-Offscreen-Oberfläche als Ziel, in das endgültige Farbwerte geschrieben werden. Die Tiefenpufferoberfläche, die der Renderzieloberfläche zugeordnet ist, wird verwendet, um Tiefeninformationen zu speichern, die Direct3D angibt, wie tief sich jedes sichtbare Pixel in der Szene befindet.

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 Projektionsbereich. Ein Tiefenpuffer, der Z-Werte verwendet, wird häufig als Z-Puffer bezeichnet, und ein Puffer, der w-Werte verwendet, wird als W-Puffer bezeichnet. Jede Art von Tiefenpuffer hat Vor- und Nachteile, die später erläutert werden.

Am Anfang des Tests wird der Tiefenwert im Tiefenpuffer auf den größten möglichen Wert für die Szene festgelegt. Der Farbwert auf der Renderingoberfläche wird entweder auf den Hintergrundfarbwert oder den Farbwert der Hintergrundtextur an diesem Punkt 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 er sich überschneidet, wird der Tiefenwert , der die Z-Koordinate in einem Z-Puffer und die w-Koordinate in einem W-Puffer sein wird, 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 in 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 gezeigt.

Diagramm des Testens von Tiefenwerten

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. Bei einer hardwarebasierten Änderung der Vergleichsfunktion werden hierarchische Z-Tests möglicherweise deaktiviert.

Fast alle Zugriffstasten auf dem Markt unterstützen z-Pufferung und machen z-Puffer heute zum am häufigsten verwendeten Tiefenpuffertyp. Aber überall haben Z-Puffer ihre Nachteile. Aufgrund der beteiligten 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 einschließlich 1,0).

Insbesondere wirkt sich das Verhältnis zwischen den weit und nahe abgeschnittenen Ebenen stark auf die Verteilung der ungleichmäßigen Z-Werte aus. Bei Verwendung eines abstandsweiten Abstands zu einem Abstand von 100 wird 90 Prozent des Tiefenpufferbereichs für die ersten 10 Prozent des Szenentiefebereichs aufgewendet. Typische Anwendungen für Unterhaltungs- oder visuelle Simulationen mit Außenszenen erfordern häufig Weitebenen-/Nahebenenverhältnisse zwischen 1.000 und 10.000. Bei einem Verhältnis von 1.000 wird 98 Prozent des Bereichs für die ersten 2 Prozent des Tiefenbereichs aufgewendet, und die Verteilung wird mit höheren Verhältnissen schlechter. Dies kann zu versteckten 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 wird häufig gleichmäßiger zwischen den nahe und weit entfernten Clipebenen verteilt als ein Z-Puffer. Der wichtigste Vorteil ist, dass das Verhältnis von Entfernungen für die weit und nahe Ausschnittebenen kein Problem mehr ist. Auf diese Weise können Anwendungen große maximale Bereiche unterstützen und gleichzeitig relativ genaue Tiefenpuffer in der Nähe des Blickpunkts erhalten. Ein w-basierter Tiefenpuffer ist nicht perfekt und kann manchmal ausgeblendete Oberflächenartefakte für nahe Objekte aufweisen. Ein weiterer Nachteil des w-buffered-Ansatzes hängt mit der Hardwareunterstützung zusammen: w-buffering wird nicht so weit wie die Z-Pufferung unterstützt.

Die Verwendung eines Z-Puffers erfordert während des Renderns Mehraufwand. Verschiedene Techniken können verwendet werden, um das Rendern bei Verwendung von Z-Puffern zu optimieren. Anwendungen können die Leistung erhöhen, wenn Sie Z-Puffer und Textur verwenden, indem Sie sicherstellen, dass Szenen von vorne nach hinten gerendert werden. Texturierte z-gepufferte Grundtypen werden auf Scanzeilenbasis mit dem Z-Puffer vorab getestet. Wenn eine Scanlinie durch ein zuvor gerendertes Polygon ausgeblendet ist, lehnt es das System schnell und effizient ab. Die Z-Pufferung kann die Leistung verbessern, aber die Technik ist am nützlichsten, wenn eine Szene mehr als einmal dieselben Pixel zeichnet. Dies ist schwierig, genau zu berechnen, aber Sie können oft eine enge Annäherung vornehmen. Wenn dieselben Pixel weniger als zweimal gezeichnet werden, können Sie die beste Leistung erzielen, indem Sie Z-Puffer deaktivieren und die Szene von hinten nach vorne rendern.

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

Tiefen- und Schablonenpuffer