深度バッファ

深度バッファ

z バッファまたは w バッファと呼ばれる深度バッファとは、Microsoft® Direct3D® で使う奥行き情報を格納するデバイスのプロパティである。Direct3D が 3D シーンをターゲット サーフェイスにレンダリングするとき、アタッチした深度バッファ サーフェイスのメモリを作業空間として使い、ラスタ化したポリゴンのピクセルが互いにどのように覆い合うのかを判定できる。Direct3D は、オフスクリーン Direct3D サーフェイスを、最終的な色値を書き込むターゲットとして使用する。レンダリング ターゲット サーフェイスに関連する深度バッファ サーフェイスは、シーンでの可視的ピクセルそれぞれの深さを Direct3D に知らせる深度情報の格納に使う。

深度バッファリングを有効にして 3D シーンをラスタ化するとき、レンダリング サーフェイス上の各点を調べる。深度バッファの値は、ポイントの z 座標または同次 w 座標 (射影空間のポイントの (x,y,z,w) 位置座標の) が可能である。z 値を使用する深度バッファは Z バッファと呼ばれ、w 値を使用する深度バッファは W バッファと呼ばれる。どちらの種類の深度バッファにも利点と欠点があるが、これについては後で説明する。

テストの最初に、深度バッファの深度値をシーンで可能な最大値に設定する。レンダリング サーフェイス上の色値は、背景の色値またはその点の背景テクスチャの色値に設定する。シーンの各ポリゴンを調べて、レンダリング サーフェイス上のカレント座標 (x,y) に当たるかどうかを確かめる。交差する場合、現在のポイントでの深度値 (Z バッファの z 座標または W バッファの w 座標) をテストして、深度バッファに既に格納されている深度値よりも小さいかどうかを確認する。ポリゴンの深度値の方が小さければ、その値が深度バッファに格納され、そのポリゴンからの色値がレンダリング サーフェイス上の現在の点に書き込まれる。その点でのポリゴンの深度値の方が大きければ、リストの次のポリゴンが調べられる。次の図に、この処理を示す。

深度値

  ほとんどのアプリケーションではこの機能を使わないが、深度バッファに入る値とレンダリング ターゲット サーフェイスを判定するために Direct3D が使うこの比較を変更できる。これを行うには、D3DRS_ZFUNC レンダリング ステートの値を変更すること。

現在では、市販のほとんどすべての 3D アクセラレータが、z バッファリングをサポートしており、Z バッファが最も一般的な深度バッファの種類になっている。しかし、Z バッファにも欠点がある。使用する数学的処理が原因で、Z バッファに生成される z 値は、Z バッファの範囲 (通常 0.0 から 1.0) 全体に均等に分布されない傾向がある。特に、遠くのクリップ面と近くのクリップ面の間の比率は、z 値の不均一な分布に強い影響を与える。近くの平面の距離に対する遠くの平面の距離の比率を 100% とした場合、深度バッファ範囲の 90% がシーンの深度範囲の最初の 10% に費やされる。娯楽や風景のシミュレーション用の典型的なアプリケーションでは、比率 (遠くの平面 / 近くの平面) がどこでも 1000 から 10000 の間である必要がある。比率が 1000 の場合、深度バッファ範囲の 98% が深度範囲の最初の 2% に費やされ、比率が高くなるにつれて分布状態が悪くなる。これによって、遠くのオブジェクトでサーフェイス ディテールが隠れてしまうことがある。これは、特に 16 ビット深度 (最も一般的なビット深度) バッファを使用する場合に顕著である。

一方、W 深度バッファでは、Z バッファの場合よりも、近くのクリップ面と遠くのクリップ面の間の分布がより均等である。したがって、遠くのクリップ面と近くのクリップ面の距離の比率が問題にならないという利点がある。これによって、アプリケーションは大きな最大範囲をサポートできる。ただし、視点に近い正確な深度バッファリングといっても相対的なものである。W 深度バッファは完璧ではなく、近くのオブジェクトのサーフェイス ディテールが隠れることがある。もう 1 つの欠点は、ハードウェア サポートに関係することである。つまり、w バッファリングはハードウェアで z バッファリングほど広くはサポートされていない。

z バッファリングには、レンダリングのときにオーバーヘッドがある。Z バッファを使用するときに、レンダリングを最適化するために使用できるさまざまな技術がある。詳細については、「Z バッファのパフォーマンス」を参照すること。

  深度値の実際の解釈は、3D レンダラによって異なる。

ここでは、深度バッファを使って隠線と隠面を消す方法について説明する。