深度バッファー (Direct3D 9)
一般に z バッファーまたは w バッファーと呼ばれる深度バッファーは、Direct3D で使用される深度情報を格納するデバイスのプロパティです。Direct3D がターゲット サーフェスへのシーンをレンダリングする場合、Direct3D はワークスペースとして関連付けられた深度バッファー サーフェスのメモリーを使用して、ラスター化されたポリゴンのピクセルが互いにオクルードする方法を決定できます。Direct3D は最終的なカラー値が書き込まれるターゲットとしてオフスクリーン Direct3D サーフェスを使用します。レンダー ターゲット サーフェスに関連付けられている深度バッファー サーフェスは、Direct3D に対してシーンに表示する各ピクセルの深さを知らせる深度情報を格納するために使用されます。
深度バッファーを有効にしてシーンをラスター化すると、レンダリング サーフェス上の各ポイントがテストされます。深度バッファーの値は、ポイントの z 座標が有効です。または、射影空間のポイント (x、y、z、w) 位置からのその同次 w 座標も有効です。z 値を使用する深度バッファーは一般に z バッファーと呼ばれ、w 値を使用する深度バッファーは w バッファーと呼ばれます。深度バッファーにはそれぞれ長所と短所があります。これについては後で説明します。
テストの最初では、深度バッファーの深度値は、シーンの最大有効値に設定されます。レンダリング サーフェスのカラー値は、背景色の値あるいはその時点での背景テクスチャーのカラー値に設定されます。シーンの各ポリゴンはテストされ、レンダリング サーフェス上の現在の座標 (x、y) と交差するかどうかが確認されます。交差する場合は、深度値は、z バッファーの z 座標となり、w バッファーの w 座標となりますが、現在のポイントがテストされ、深度バッファーに格納されている深度値よりも小さいかどうかが確認されます。ポリゴンの値の深度が小さい場合、これは深度バッファーに格納され、ポリゴンからのカラー値はレンダリング サーフェス上の現在のポイントに書き込まれます。そのポイントでのポリゴンの深度値が大きい場合、リスト内の次のポリゴンがテストされます。このプロセスを次の図に示します。
注 ほとんどのアプリケーションはこの機能を使用しませんが、深度バッファー、およびそれ以降のレンダー ターゲット サーフェスに置かれている値を決定するために Direct3D が使用する比較を変更できます。これには、D3DRS_ZFUNC レンダリング ステートの値を変更します。一部のハードウェアでは、比較機能を変更すると、階層的 z テストが無効になることがあります。
市販されているほとんどすべてのアクセラレーターが z バッファーリングをサポートするため、z バッファーは今日の深度バッファーの最も一般的なタイプになっています。ただし、ユビキタスな z バッファーには欠点があります。関係する算術により、z バッファーに生成された z 値は、z バッファー範囲 (通常は 0.0 から 1.0) にわたって均等に分散されない傾向があります。とりわけ、遠方のクリップ面と近くのクリップ面との間の比は、v 値が不規則に分散される方法に大きく影響します。後方面距離と前方面距離の比率を100 とすると、深度バッファー範囲の 90 パーセントがシーンの深度範囲の最初の 10 パーセントで消費されます。エンターテイメントや屋外のシーンとの視覚的シミュレーションを目的とした典型的なアプリケーションでは、1,000 から 10,000 の間の前方距離と後方距離の比率が必要となることがよくあります。1,000 の比率では、範囲の 98 パーセントが深度範囲の最初の 2 パーセントで消費され、より高い比率でさらにうまく分散されません。これによって、遠くの物体においてサーフェスのアーティファクトが見えなくなることがあります。最もサポートされているビット深度である 16 ビット深度のバッファーを使用する場合には特にそうです。
一方、 z バッファーに比べて、w ベースの深度バッファーは、ほとんどの場合、近くのクリップ面と遠くのクリップ面との間で均等に分散されます。w バッファーの重要な利点とは、遠くのクリップ面と近くのクリップ面との距離の比率が問題ではなくなるということです。このため、アプリケーションは広い最大範囲をサポートしながらも、視点に近い比較的正確な深度バッファーリングを達成できます。w ベースの深度バッファーは完全ではなく、ときには近くの物体に対して隠れサーフェスのアーティファクトが発生することがあります。w バッファーの手法のもう 1 つの欠点は、ハードウェアのサポートに関連します。w バッファーは z バッファーリングほどはハードウェアでサポートされていません。
z バッファーを使用する場合、レンダリング中にオーバーヘッドが必要になります。z バッファーの使用時にレンダリングを最適化するために、さまざまなテクニックを使用できます。詳細については、「Z バッファーのパフォーマンス」を参照してください。
注 深度値の実際の解釈はレンダラーに固有です。
ここでは、深度バッファーを使用した隠し線と隠しサーフェスの削除に関する情報を示します。