深度バッファー

深度バッファー (z バッファー) は、ビューから隠される多角形の領域ではなく、レンダリングされるポリゴンの領域を制御する深度情報を格納します。

概要

z バッファーや w バッファーとも呼ばれる、深度バッファーは、Direct3D で使用される深度情報を格納するデバイスのプロパティです。 Direct3D でターゲット サーフェスにシーンをレンダリングする場合、関連付けられた深度バッファー サーフェス内のメモリをワークスペースとして使用して、ラスタライズされた多角形のピクセルがどのように隠れるかを決定します。 Direct3D では、最終的な色の値が書き込まれるをターゲットとして、オフスクリーンの Direct3D サーフェスを使用します。 レンダー ターゲット サーフェスに関連付けられている深度バッファー サーフェスは、Direct3D に対してシーンに表示する各ピクセルの奥行きを知らせる深度情報を格納するために使用されます。

深度バッファーを有効にしてシーンをラスタライズすると、レンダリング サーフェス上の各ポイントがテストされます。 深度バッファー内の値として、ポイントの z 座標または射影空間内のポイントの位置 (x,y,z,w) の同次 w 座標を使用できます。 z 値を使う深度バッファーは通常 z バッファーと呼ばれ、w 値を使う深度バッファーは w バッファーと呼ばれます。 各種の深度バッファーには長所と短所があります。これについては後で説明します。

テストの開始時に、深度バッファーの深度値はシーンの最大値に設定されます。 レンダリング サーフェス上の色の値は、その時点での背景色の値または背景テクスチャの色の値のいずれかに設定されます。 シーン内の各多角形が、レンダリング サーフェス上の現在の座標 (x,y) と交差するかどうかがテストされます。

交差する場合、現在のポイントの深度値 (z バッファーでは z 座標、w バッファーでは w 座標) がテストされ、深度バッファーに格納された深度値よりも小さいかどうかが確認されます。 多角形の深度の値が小さい場合は、その値が深度バッファーに格納され、多角形の色の値がレンダリング サーフェスの現在のポイントに書き込まれます。 そのポイントでの多角形の深度値の方が大きい場合は、リスト内の次の多角形がテストされます。 このプロセスを次の図に示します。

深度値のテストの図

バッファー処理の手法

ほとんどのアプリケーションはこの機能を使用しませんが、深度バッファーに配置し、その後、レンダー ターゲット サーフェスに配置する値を決定するために Direct3D が使用する比較の方法を変更できます。 一部のハードウェアでは、比較関数を変更すると、階層化 z テストが無効になることがあります。

市場のほぼすべてのアクセラレータは z バッファーをサポートしているため、z バッファーは、現在、最も一般的な種類の深度バッファーとなっています。 広く普及していますが、z バッファーには欠点もあります。 関連する演算の影響により、z バッファーで生成された z 値は、z バッファー範囲 (通常 0.0 ~ 1.0、両端を含む) にわたって均等に分散しない傾向があります。

具体的には、近クリップ面と遠クリップ面との比率は、z 値が均等に分散しないことに大きく影響します。 遠い面までの距離と近い面までの距離の比率を 100 とした場合、深度バッファー範囲の 90% がシーンの深度範囲の最初の 10% で消費されます。 エンターテイメントや屋外のシーンの視覚的シミュレーションを目的とした一般的なアプリケーションでは、通常、遠い面と近い面の比率を 1,000 ~ 10,000 にする必要があります。 比率が 1,000 の場合、範囲の 98% が深度範囲の最初の 2% で費やされ、比率が高くなるほど分散の状況も悪化します。 これにより、遠くのオブジェクトで、特に、最も一般的にサポートされているビット深度である 16 ビットの深度バッファーを使う場合に、陰面のアーティファクトが発生することがあります。

一方、w ベースの深度バッファーは、z バッファーと比べて、近クリップ面と遠クリップ面の間で均等に分散します。 主なメリットは、遠クリップ面と近クリップ面の距離の比率が問題ではなくなるという点です。 これにより、アプリケーションでは、広い最大範囲をサポートしながら、視点の近くで比較的正確な深度バッファー処理を実現できます。 w ベースの深度バッファーも完全ではなく、近いオブジェクトで陰面のアーティファクトが発生する場合があります。 w バッファーによるアプローチのもう 1 つの欠点として、ハードウェアのサポートが挙げられます。w バッファー処理は、ハードウェアで z バッファー処理ほど広くサポートされていません。

z バッファーを使うと、レンダリング中にオーバーヘッドが必要です。 z バッファーを使用する場合、さまざまな手法でレンダリングを最適化できます。 アプリケーションでは、シーンが前面から順にレンダリングされるように処理することで、z バッファー処理を使用する際のパフォーマンスを向上させることができます。 テクスチャ処理された z バッファーのプリミティブは、スキャン ライン ベースで z バッファーについて事前にテストされます。 スキャン ラインが以前にレンダリングされた多角形によって隠れる場合、システムは迅速かつ効率的にそれを拒否します。 z バッファー処理によって、パフォーマンスを向上させることもできますが、この手法はシーンで同じピクセルを複数回描画するときに最も役に立ちます。 これを厳密に計算することは困難ですが、多くの場合、非常に近い結果を得ることができます。 同じピクセルの描画が 2 回未満である場合は、z バッファー処理を無効にして、背面から順にシーンをレンダリングすることによって、最適なパフォーマンスを実現できます。

深度値の実際の解釈はレンダラーに固有です。

関連トピック

深度バッファーとステンシル バッファー