深度バッファーDepth buffers

深度バッファー (z バッファー) は、ビューから隠される多角形の領域ではなく、レンダリングされるポリゴンの領域を制御する深度情報を格納します。A depth buffer, or z-buffer, stores depth information to control which areas of polygons are rendered rather than hidden from view.

概要Overview

z バッファーや w バッファーとも呼ばれる、深度バッファーは、Direct3D で使用される深度情報を格納するデバイスのプロパティです。A depth buffer, often called a z-buffer or a w-buffer, is a property of the device that stores depth information to be used by Direct3D. Direct3D でターゲット サーフェスにシーンをレンダリングする場合、関連付けられた深度バッファー サーフェス内のメモリをワークスペースとして使用して、ラスタライズされた多角形のピクセルがどのように隠れるかを決定します。When Direct3D renders a scene to a target surface, it can use the memory in an associated depth-buffer surface as a workspace to determine how the pixels of rasterized polygons occlude one another. Direct3D では、最終的な色の値が書き込まれるをターゲットとして、オフスクリーンの Direct3D サーフェスを使用します。Direct3D uses an off-screen Direct3D surface as the target to which final color values are written. レンダー ターゲット サーフェスに関連付けられている深度バッファー サーフェスは、Direct3D に対してシーンに表示する各ピクセルの奥行きを知らせる深度情報を格納するために使用されます。The depth-buffer surface that is associated with the render-target surface is used to store depth information that tells Direct3D how deep each visible pixel is in the scene.

深度バッファーを有効にしてシーンをラスタライズすると、レンダリング サーフェス上の各ポイントがテストされます。When a scene is rasterized with depth buffering enabled, each point on the rendering surface is tested. 深度バッファー内の値として、ポイントの z 座標または射影空間内のポイントの位置 (x,y,z,w) の同次 w 座標を使用できます。The values in the depth buffer can be a point's z-coordinate or its homogeneous w-coordinate - from the point's (x,y,z,w) location in projection space. z 値を使う深度バッファーは通常 z バッファーと呼ばれ、w 値を使う深度バッファーは w バッファーと呼ばれます。A depth buffer that uses z values is often called a z-buffer, and one that uses w values is called a w-buffer. 各種の深度バッファーには長所と短所があります。これについては後で説明します。Each type of depth buffer has advantages and disadvantages, which are discussed later.

テストの開始時に、深度バッファーの深度値はシーンの最大値に設定されます。At the beginning of the test, the depth value in the depth buffer is set to the largest possible value for the scene. レンダリング サーフェス上の色の値は、その時点での背景色の値または背景テクスチャの色の値のいずれかに設定されます。The color value on the rendering surface is set to either the background color value or the color value of the background texture at that point. シーン内の各多角形が、レンダリング サーフェス上の現在の座標 (x,y) と交差するかどうかがテストされます。Each polygon in the scene is tested to see if it intersects with the current coordinate (x,y) on the rendering surface.

交差する場合、現在のポイントの深度値 (z バッファーでは z 座標、w バッファーでは w 座標) がテストされ、深度バッファーに格納された深度値よりも小さいかどうかが確認されます。If it does intersect, the depth value - which will be the z coordinate in a z-buffer, and the w coordinate in a w-buffer - at the current point is tested to see if it is smaller than the depth value stored in the depth buffer. 多角形の深度の値が小さい場合は、その値が深度バッファーに格納され、多角形の色の値がレンダリング サーフェスの現在のポイントに書き込まれます。If the depth of the polygon value is smaller, it is stored in the depth buffer and the color value from the polygon is written to the current point on the rendering surface. そのポイントでの多角形の深度値の方が大きい場合は、リスト内の次の多角形がテストされます。If the depth value of the polygon at that point is larger, the next polygon in the list is tested. このプロセスを次の図に示します。This process is shown in the following diagram.

深度値のテストの図

バッファリングの手法Buffering techniques

ほとんどのアプリケーションはこの機能を使用しませんが、深度バッファーに配置し、その後、レンダー ターゲット サーフェスに配置する値を決定するために Direct3D が使用する比較の方法を変更できます。Although most applications don't use this feature, you can change the comparison that Direct3D uses to determine which values are placed in the depth buffer and subsequently the render-target surface. 一部のハードウェアでは、比較関数を変更すると、階層化 z テストが無効になることがあります。On some hardware, changing the compare function may disable hierarchical z testing.

市場のほぼすべてのアクセラレータは z バッファーをサポートしているため、z バッファーは、現在、最も一般的な種類の深度バッファーとなっています。Nearly all accelerators on the market support z-buffering, making z-buffers the most common type of depth buffer today. 広く普及していますが、z バッファーには欠点もあります。However ubiquitous, z-buffers have their drawbacks. 関連する演算の影響により、z バッファーで生成された z 値は、z バッファー範囲 (通常 0.0 ~ 1.0、両端を含む) にわたって均等に分散しない傾向があります。Due to the mathematics involved, the generated z values in a z-buffer tend not to be distributed evenly across the z-buffer range (typically 0.0 to 1.0, inclusive).

具体的には、近クリップ面と遠クリップ面との比率は、z 値が均等に分散しないことに大きく影響します。Specifically, the ratio between the far and near clipping planes strongly affects how unevenly z values are distributed. 遠い面までの距離と近い面までの距離の比率を 100 とした場合、深度バッファー範囲の 90% がシーンの深度範囲の最初の 10% で消費されます。Using a far-plane distance to near-plane distance ratio of 100, 90 percent of the depth buffer range is spent on the first 10 percent of the scene depth range. エンターテイメントや屋外のシーンの視覚的シミュレーションを目的とした一般的なアプリケーションでは、通常、遠い面と近い面の比率を 1,000 ~ 10,000 にする必要があります。Typical applications for entertainment or visual simulations with exterior scenes often require far-plane/near-plane ratios of anywhere between 1,000 to 10,000. 比率が 1,000 の場合、範囲の 98% が深度範囲の最初の 2% で費やされ、比率が高くなるほど分散の状況も悪化します。At a ratio of 1,000, 98 percent of the range is spent on the first 2 percent of the depth range, and the distribution becomes worse with higher ratios. これにより、遠くのオブジェクトで、特に、最も一般的にサポートされているビット深度である 16 ビットの深度バッファーを使う場合に、陰面のアーティファクトが発生することがあります。This can cause hidden surface artifacts in distant objects, especially when using 16-bit depth buffers, the most commonly supported bit-depth.

一方、w ベースの深度バッファーは、z バッファーと比べて、近クリップ面と遠クリップ面の間で均等に分散します。A w-based depth buffer, on the other hand, is often more evenly distributed between the near and far clip planes than a z-buffer. 主なメリットは、遠クリップ面と近クリップ面の距離の比率が問題ではなくなるという点です。The key benefit is that the ratio of distances for the far and near clipping planes is no longer an issue. これにより、アプリケーションでは、広い最大範囲をサポートしながら、視点の近くで比較的正確な深度バッファー処理を実現できます。This allows applications to support large maximum ranges, while still getting relatively accurate depth buffering close to the eye point. w ベースの深度バッファーも完全ではなく、近いオブジェクトで陰面のアーティファクトが発生する場合があります。A w-based depth buffer isn't perfect, and can sometimes exhibit hidden surface artifacts for near objects. w バッファーによるアプローチのもう 1 つの欠点として、ハードウェアのサポートが挙げられます。w バッファー処理は、ハードウェアで z バッファー処理ほど広くサポートされていません。Another drawback to the w-buffered approach is related to hardware support: w-buffering isn't supported as widely in hardware as z-buffering.

z バッファーを使うと、レンダリング中にオーバーヘッドが必要です。Using a z-buffer requires overhead during rendering. z バッファーを使用する場合、さまざまな手法でレンダリングを最適化できます。Various techniques can be used to optimize rendering when using z-buffers. アプリケーションでは、シーンが前面から順にレンダリングされるように処理することで、z バッファー処理を使用する際のパフォーマンスを向上させることができます。Applications can increase performance when using z-buffering and texturing by ensuring that scenes are rendered from front to back. テクスチャ処理された z バッファーのプリミティブは、スキャン ライン ベースで z バッファーについて事前にテストされます。Textured z-buffered primitives are pretested against the z-buffer on a scan line basis. スキャン ラインが以前にレンダリングされた多角形によって隠れる場合、システムは迅速かつ効率的にそれを拒否します。If a scan line is hidden by a previously rendered polygon, the system rejects it quickly and efficiently. z バッファー処理によって、パフォーマンスを向上させることもできますが、この手法はシーンで同じピクセルを複数回描画するときに最も役に立ちます。Z-buffering can improve performance, but the technique is most useful when a scene draws the same pixels more than once. これを厳密に計算することは困難ですが、多くの場合、非常に近い結果を得ることができます。This is difficult to calculate exactly, but you can often make a close approximation. 同じピクセルの描画が 2 回未満である場合は、z バッファー処理を無効にして、背面から順にシーンをレンダリングすることによって、最適なパフォーマンスを実現できます。If the same pixels are drawn less than twice, you can achieve the best performance by turning z-buffering off and rendering the scene from back to front.

深度値の実際の解釈はレンダラーに固有です。The actual interpretation of a depth value is specific to the renderer.

関連トピックRelated topics

深度バッファーとステンシル バッファーDepth and stencil buffers