Zバッファリング


Z-buffering

参照:
グラフィックスパイプライン
デプスバッファとしても知られ、Zバッファは、の一種であるデータバッファで使用されるコンピュータグラフィックスのオブジェクトの奥行き情報を表すために3D空間の特定の観点。デプスバッファは、シーンをレンダリングして、正しいポリゴンが他のポリゴンを適切に遮るようにするのに役立ちます。Zバッファリングは、1974年にWolfgangStraßerによって、遮蔽されたオブジェクトをレンダリングするための高速アルゴリズムに関する博士論文で最初に説明されました。重なり合うポリゴンを決定するための同様の解決策は、画家のアルゴリズムです。、これは不透明でないシーン要素を処理できますが、効率と誤った結果が犠牲になります。
Zバッファデータ
、深度バッファの概念が明確に説明され
 「Zバッファリング」  
3Dレンダリングパイプラインオブジェクトがスクリーンに投影されたときに、発生の深さ(Z値)断片投影画面には、既にバッファ(に格納された値と比較される深度テスト)、及びそれに取って代わります新しい値が近い場合。これは、色付きの値を計算するラスタライザーと連携して機能します。ラスタライザによって出力されたフラグメントは、別のフラグメントとオーバーラップしていない場合に保存されます。
部分的または完全に重なり合う不透明なオブジェクトまたはサーフェスを含む画像を表示する場合、ビューアから最も遠く、他のオブジェクトの背後にあるオブジェクトを完全に表示することはできません(つまり、一部のサーフェスが他のオブジェクトの背後に隠れています)。重なり合うサーフェスを管理するメカニズムがない場合、サーフェスは他のオブジェクトの背後にあることを意図しているかどうかを気にせずに、互いの上にレンダリングされます。これらの表面の識別と除去は、隠面問題と呼ばれます。オーバーラップをチェックするために、コンピューターは最初のオブジェクトに対応するピクセルのz値を計算し、それをzバッファー内の同じピクセル位置にあるz値と比較します。計算されたz値がすでにzバッファにあるz値よりも小さい場合(つまり、新しいピクセルが近い場合)、zバッファ内の現在のz値は計算値に置き換えられます。これは、シーン内のすべてのオブジェクトとサーフェスに対して繰り返されます(多くの場合、並列)。結局、zバッファは、通常の奥行き知覚の正しい再現を可能にします。近くのオブジェクトは、遠くに隠れます。これはzカリングと呼ばれます。
zバッファは、画像と同じ内部データ構造、つまり2d配列を持っていますが、唯一の違いは、3つの値を使用して色を作成するカラー画像ではなく、画面のピクセルごとに1つの値を格納することです。これにより、zバッファは色情報を格納していないため、白黒で表示されます。バッファは、一貫性を保つために画面バッファと同じサイズです。
レンダリングに不要な特定のポリゴンをスキップするために、通常、一次可視性テスト(背面カリングなど)と二次可視性テスト(オーバーラップチェックや画面クリッピングなど)がオブジェクトのポリゴンに対して実行されます。比較すると、Zバッファは比較的高価であるため、一次および二次の可視性テストを実行すると、Zバッファの負荷が軽減されます。
Zバッファの粒度は、シーンの品質に大きな影響を与えます。従来の16ビットZバッファは、2つのオブジェクトが互いに非常に接近している場合に、アーティファクト(「Zファイティング」またはスティッチングと呼ばれる)を引き起こす可能性が最新の24ビットまたは32ビットのzバッファの動作ははるかに優れていますが、追加のアルゴリズムがないと問題を完全に解消することはできません。8ビットのZバッファが少なすぎる精度を有しているので使用はほとんどないれます。

コンテンツ
1 用途
2 開発
3 Zカリング
4 数学
4.1 固定小数点表現 4.2 Wバッファ
5 アルゴリズム学
6 も参照してください
7 参考文献
8 外部リンク
9 ノート

用途
Zバッファは、3Dコンピュータグラフィックスを実行するために、ほとんどすべての現代のコンピュータ、ラップトップ、および携帯電話で使用されているテクノロジです。現在の主な用途は、3Dシーンの高速で正確な処理を必要とするビデオゲームです。Zバッファは、民生用グラフィックカード内のハードウェアに実装されています。Zバッファは、コンピュータで生成されたフィルムの特殊効果を生成するためにも使用されます(ハードウェアではなくソフトウェアとして実装されます)。
さらに、ライトの視点からサーフェスをレンダリングして得られたZバッファデータにより、シャドウマッピング技術によるシャドウの作成が可能になります。

開発
粒度が十分に小さい場合でも、zバッファの距離値の精度が距離全体に均等に分散されていない場合、品質の問題が発生する可能性が近い値は、遠い値よりもはるかに正確です(したがって、より近いオブジェクトをより適切に表示できます)。通常、これは望ましいことですが、オブジェクトが遠くなるにつれてアーティファクトが表示される場合がより均一に分散された精度をもたらすzバッファリングのバリエーションは、wバッファリングと呼ばれます(以下を参照)。
新しいシーンの開始時に、zバッファを定義された値(通常は1.0)にクリアする必要がこれは、この値が深さの上限(0から1のスケールで)であり、オブジェクトが存在しないことを意味するためです。視錐台を通してこの点。
zバッファの概念の発明は、ほとんどの場合、エドウィンキャットマルに起因しますが、ヴォルフガングシュトラーサーは、1974年の博士号でこのアイデアを説明しました。キャットマルの発明の数ヶ月前の論文。
最近のPCグラフィックカード(1999〜2005)では、zバッファ管理は使用可能なメモリ 帯域幅のかなりの部分を使用します。ロスレス圧縮(圧縮/解凍するコンピューターリソースは帯域幅よりも安価です)や、廃止された「1フレームをポジティブ、1フレーム」にする超高速ハードウェアz-clearなど、さまざまな方法がzバッファリングのパフォーマンスコストを削減するために採用されています。ネガティブ」トリック(符号付き数値を使用してフレーム間クリアを完全にスキップし、深さを巧みにチェックします)。

Zカリング
でレンダリング、Zカリングは、深さに基づいて初期ピクセル除去、隠された面で高価である描画するときのパフォーマンスの増加を提供する方法です。これは、zバッファリングの直接的な結果であり、各ピクセル候補の深さが、背後に隠れている可能性のある既存のジオメトリの深さと比較されます。
Zバッファを使用する場合、ピクセルの深さがわかるとすぐにピクセルをカリング(破棄)できます。これにより、とにかく表示されないピクセルのライティングとテクスチャリングのプロセス全体をスキップできます。また、時間のかかるピクセルシェーダーは、通常、カリングされたピクセルに対して実行されません。これにより、フィルレート、ライティング、テクスチャリング、またはピクセルシェーダーが主なボトルネックとなる状況で、zカリングが最適化の候補になります。
Zバッファリングを使用すると、ジオメトリの並べ替えを解除できますが、深度を増やしてポリゴンを並べ替えると(したがって、リバースペインターのアルゴリズムを使用して)、各画面ピクセルのレンダリング回数を減らすことができます。これにより、大量のオーバードローが発生するフィルレートが制限されたシーンのパフォーマンスが向上する可能性がありますが、Zバッファリングと組み合わせない場合、次のような深刻な問題が発生します。
ポリゴンはサイクル内で互いに閉塞する可能性があり(例:三角形AはBを閉塞し、BはCを閉塞し、CはAを閉塞します)、
三角形には正規の「最も近い」点はありません(たとえば、三角形を重心、最も近い点、または最も遠い点で並べ替えても、Aが「近い」が実際にはBであるような2つの三角形AとBを常に見つけることができます。最初に描画する必要があります)。
そのため、リバースペインターのアルゴリズムは、Zカリングの最適化を除いて、Zカリングの代替として(精力的なリエンジニアリングなしで)使用することはできません。たとえば、最適化では、2つのポリゴンにオクルージョンの相互作用があるかどうかをすばやく判断するために、ポリゴンをx / y-locationとz-depthに従って並べ替えて、境界を提供します。

数学
レンダリングされるカメラ空間の深度値の範囲は、多くの場合、
近く
{{ textit {near}}}

  と
遠い
{{ textit {far}}}

  の値 z {z}

 。
パースペクティブ変換後、の新しい値 z {z}

 、 また
z ′ {z ‘}

 、は次のように定義されます。z ′ = 遠い + 近く
遠い − 近く+ 1 z(( −
2 ⋅ 遠い ⋅ 近く
遠い − 近く )。 {z ‘= { frac {{ textit {far}} + { textit {near}}} {{ textit {far}}-{ textit {near}}}} + { frac {1 } {z}} left({ frac {-2 cdot { textit {far}} cdot { textit {near}}} {{ textit {far}}-{ textit {near}}} }右)}
  正射影の後、の新しい値 z {z}

 、 また
z ′ {z ‘}

 、は次のように定義されます。 z ′ 2⋅ z −
近く
遠い − 近く− 1
{z ‘= 2 cdot { frac {{z}-{ textit {near}}} {{ textit {far}}-{ textit {near}}}}-1}
  どこ z {z}

  の古い値です z {z}

  カメラ空間で、時々呼ばれます w {w}

  また
w ′ {w ‘}

 。
結果の値
z ′ {z ‘}

  -1と1の値の間で正規化されます。ここで、
近く
{{ textit {near}}}

  平面は-1にあり、{{ mathit {far}}}

 平面は1にこの範囲外の値は、視錐台にないポイントに対応しているため、レンダリングしないで

固定小数点表現
通常、これらの値は、ハードウェアグラフィックアクセラレータのzバッファに固定小数点形式で格納されます。まず、適切な変換を代入することにより、より一般的な範囲であるに正規化されます。 z2 =1 2(( z1′ + 1)。
{z’_ {2} = { frac {1} {2}} left(z’_ {1} + 1 right)}

  前の式に:z ′ = 遠い + 近く
2 ⋅ (( 遠い − 近く
)。 1 2+ 1 z(( −
遠い ⋅ 近く
遠い − 近く )。 {z ‘= { frac {{ textit {far}} + { textit {near}}} {2 cdot left({ textit {far}}-{ textit {near}} right )}} + { frac {1} {2}} + { frac {1} {z}} left({ frac {-{ textit {far}} cdot { textit {near}}} {{ textit {far}}-{ textit {near}}}} right)}
  簡略化:z ′ = 遠い(( 遠い − 近く
)。+ 1 z(( −
遠い ⋅ 近く
遠い − 近く )。 {z ‘= { frac { textit {far}} { left({ textit {far}}-{ textit {near}} right)}} + { frac {1} {z} } left({ frac {-{ textit {far}} cdot { textit {near}}} {{ textit {far}}-{ textit {near}}}} right)}
  次に、上記の式に次の式を掛けます。 =2− 1
{S = 2 ^ {d} -1}

 ここで、dはzバッファの深さ(通常は16、24、または32ビット)であり、結果を整数に丸めます。z ′= (( z
)。= ⌊(( 2 − 1 )。 ⋅ (( 遠い(( 遠い − 近く
)。+ 1 z(( −
遠い ⋅ 近く
遠い − 近く )。 )。 ⌋ {z ‘= f(z)= left lfloor left(2 ^ {d} -1 right) cdot left({ frac { textit {far}} { left({ textit {far}}-{ textit {near}} right)}} + { frac {1} {z}} left({ frac {-{ textit {far}} cdot { textit {near }}} {{ textit {far}}-{ textit {near}}}} right) right) right rfloor}
  この式は、zバッファの解像度(前述の「粒度」)を計算するために逆にして導出できます。上記の逆 (( z )。 {f(z)、}