深度バッファー (Direct3D 9)

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

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

テストの開始時に、深度バッファーの深度値はシーンの最大値に設定されます。 レンダリング サーフェス上の色の値は、その時点での背景色の値または背景テクスチャの色の値のいずれかに設定されます。 シーン内の各多角形が、レンダリング サーフェス上の現在の座標 (x,y) と交差するかどうかがテストされます。 その場合、深度値 (z バッファー内の z 座標、w バッファー内の w 座標) は、現在のポイントでテストされ、深度バッファーに格納されている深度値よりも小さいかどうかを確認します。 多角形の深度の値が小さい場合は、その値が深度バッファーに格納され、多角形の色の値がレンダリング サーフェスの現在のポイントに書き込まれます。 そのポイントでの多角形の深度値の方が大きい場合は、リスト内の次の多角形がテストされます。 このプロセスを次の図に示します。

深度値のテストの図

Note

ほとんどのアプリケーションはこの機能を使用しませんが、深度バッファーに配置し、その後、レンダー ターゲット サーフェスに配置する値を決定するために Direct3D が使用する比較の方法を変更できます。 これを行うには、D3DRS_ZFUNCレンダリング状態の値を変更します。 一部のハードウェアでは、比較関数を変更すると、階層化 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 バッファーパフォーマンス」を参照してください。

注意

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

 

このセクションでは、隠線と非表示サーフェスの削除に深度バッファーを使用する方法について説明します。

Direct3D レンダリング