Platform SDK: DirectX |
z バッファまたは w バッファと呼ばれる深度バッファとは、Direct3D で使用する奥行き情報を格納する DirectDraw サーフェスのことである。Direct3D が 3D シーンをターゲット サーフェスにレンダリングするとき、アタッチされた深度バッファ サーフェスのメモリを作業空間として使用して、ラスタ化したポリゴンのピクセルが互いにどのように覆い合うのかを判定できる。Direct3D は、オフスクリーン DirectDraw サーフェスを、最終的なカラー値を書き込むターゲットとして使用する。レンダリング ターゲット サーフェスにアタッチした深度バッファ サーフェスは、シーンでの可視的ピクセルそれぞれの「深さ」を Direct3D に知らせる深度情報の格納に使用する。
深度バッファリングを有効にして 3D シーンをラスタ化するとき、レンダリング サーフェス上の各点が調べられる。深度バッファの値は、点の z 座標または同次 w 座標 (射影空間の点の (x,y,z,w) 位置座標の) でありうる。z 値を使用する深度バッファは「Z バッファ」と呼ばれ、w 値を使用する深度バッファは「W バッファ」と呼ばれる。どちらの種類の深度バッファにも、それぞれの利点と欠点があるが、これについては後述する。
テストの最初に、深度バッファの深度値をシーンで可能な最大値にセットする。レンダリング サーフェス上のカラー値は、背景のカラー値またはその点の背景テクスチャのカラー値にセットする。シーンの各ポリゴンを調べて、レンダリング サーフェス上のカレント座標 (x,y) と交差するかどうかを確かめる。交差すれば、カレント点での深度値 (Z バッファの z 座標または W バッファの w 座標) をテストして、深度バッファに既に格納されている深度値よりも小さいかどうかを確かめる。ポリゴンの深度値の方が小さければ、その値が深度バッファに格納され、そのポリゴンからのカラー値がレンダリング サーフェス上のカレント点に書き込まれる。その点でのポリゴンの深度値の方が大きければ、リストの次のポリゴンが調べられる。次の図に、この処理を示す。
注 : ほとんどのアプリケーションではこの機能を使用しないが、深度バッファに入る値とレンダリング ターゲット サーフェスを判定するために Direct3D が使用するこの比較を変更できる。これを行うには、D3DRENDERSTATE_ZFUNC レンダリング ステートの値を変更すること。
注 : ほとんどのアプリケーションではこの機能を使用しないが、深度バッファに入る値とレンダリング ターゲット サーフェスを判定するために Direct3D が使用するこの比較を変更できる。これを行うには、D3DRENDERSTATE_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 バッファリングほど広くはサポートされていない。
DirectDraw の HEL では、Direct3D またはその他の 3D レンダリング ソフトウェア用の深度バッファを作成できる。HEL は、16 ビット深度バッファをサポートする。この 3D アクセラレータ用の DirectDraw デバイス ドライバでは、DDSCAPS_ZBUFFER フラグを開示しているので、ディスプレイ メモリの深度バッファを作成できる。IDirect3D7::EnumZBufferFormats メソッドを呼び出して、サポートされている深度バッファのビット深度を問い合わせることができる。
Z バッファ サーフェスをどの時点で作成しても、アプリケーションは、Direct3D システムをシャットダウンするまで Z バッファへのポインタを保持しなければならない。プログラムでは、レンダリング サーフェスを解放する直前に Z バッファ サーフェスを解放しなければならない。
DirectDraw の HEL では、Direct3D またはその他の 3D レンダリング ソフトウェア用の深度バッファを作成できる。HEL は、16 ビット深度バッファをサポートする。この 3D アクセラレータ用の DirectDraw デバイス ドライバでは、DDSCAPS_ZBUFFER フラグを開示しているので、ディスプレイ メモリの深度バッファを作成できる。Direct3D7.GetEnumZBufferFormats メソッドを呼び出して、サポートされている深度バッファのビット深度を問い合わせることができる。GetEnumZBufferFormats メソッドは、深度バッファ用にサポートされているピクセル フォーマットを含む Direct3DEnumPixelFormats クラス オブジェクトへの参照を返す。
z バッファリングには、レンダリングのときにオーバーヘッドがある。Z バッファを使用するときに、レンダリングを最適化するために使用できるさまざまな技術がある。詳細については、「Z バッファのパフォーマンス」を参照すること。
注 : 深度値の実際の解釈は、3D レンダラによって異なる。