Zファイティング


Z-fighting

 「Zファイティング」  
Zファイティングは、スティッチングまたはプレーンファイティングとも呼ばれ、2つ以上のプリミティブのカメラまでの距離が非常に似ている場合に発生する3Dレンダリングの現象です。これにより、zバッファにほぼ類似または同一の値が設定され、深度が追跡されます。これは、特定のピクセルがレンダリングされているときに、2つのプリミティブのどちらがそのピクセルに描画されるかがほぼランダムであることを意味します。これは、zバッファがどちらが他方から遠いのかを正確に区別できないためです。 1つのピクセルが明確に接近している場合、接近していないピクセルは破棄される可能性がそれは特に共面で普及していますポリゴン。2つの面が基本的に同じスペースを占め、どちらも前面にありません。影響を受けるピクセルは、zバッファの精度によって決定される方法で、1つのポリゴンまたは他のポリゴンからのフラグメントで任意にレンダリングされます。また、シーンやカメラが変更されると変化する可能性があり、1つのポリゴンがzテストに「勝ち」、次に別のポリゴンが「勝ち」ます。全体的な効果は、画面のピクセルを着色するために「戦う」2つのポリゴンのちらつき、ノイズの多いラスタライズです。この問題は通常、限られたサブピクセル精度と浮動小数点および固定小数点の 丸め誤差によって引き起こされます。
灰色の背景に複数の色とテクスチャを使用したZファイティングのデモンストレーション
使用するzバッファの精度が高いほど、zファイティングが発生する可能性は低くなります。しかし、同一平面上のポリゴンの場合、修正措置を講じない限り、問題は避けられません。
ニアクリッププレーンとファークリッププレーンの間の距離が大きくなると、特にニアプレーンが目の近くで選択されると、プリミティブ間のzファイティングが発生する可能性が高くなります。大規模な仮想環境では、必然的に、遠方と前景の可視性を解決する必要性の間に本質的な矛盾がそのため、たとえば宇宙飛行シミュレーターでは、遠方の銀河を縮尺どおりに描画すると、解決する精度がなくなります。フォアグラウンドのコックピットジオメトリの可視性(ただし、数値表現でさえ、Zバッファレンダリングの前に問題が発生します)。これらの問題を軽減するために、zバッファの精度はクリップ面に近い方向に重み付けされますが、これはすべての可視性スキームに当てはまるわけではなく、すべてのzファイティングの問題を排除するには不十分です。

緩和
image"
  2つの同一平面上のポリゴンで見られる効果。
Z-戦闘は、より高い解像度を使用することによって低減することができるデプスバッファにより、Zバッファリングいくつかのシナリオで、または単にさらに離れポリゴンを移動することによって。この方法で完全に排除できないZファイティングは、多くの場合、ステンシルバッファーを使用するか、画面に投影された形状に影響を与えない1つのポリゴンに変換後の画面スペースのzバッファーオフセットを適用することで解決されます。ただし、ピクセルの補間および比較中のオーバーラップを排除するために、zバッファ値に影響を与えます。Zファイティングが同じジオメトリのハードウェア内の異なる変換パスによって引き起こされる場合(たとえば、マルチパスレンダリングスキーム)、ハードウェアに不変の頂点変換を使用するように要求することで解決できる場合が
デプスバッファの精度が不十分なために発生するZファイティングは、世界の可視距離を短くするだけで解決できます。これにより、近平面と遠平面の間の距離が短くなり、精度の問題が解決されます。ただし、宇宙シミュレータや飛行シミュレータなどの特定の仮想環境では、これは不可能です。これらの場合、代替手法が存在します。これらの手法の1つは、実際に位置を変更せずに、ユーザーから遠く離れたオブジェクトの距離を「シミュレート」することです。たとえば、最大安全視距離(zファイティングが発生する距離を超える)が10,000ユニットで、レンダリングされるオブジェクトが15,000ユニット離れている場合、そのオブジェクトは代わりに10,000ユニットでレンダリングできますが、それに比例して縮小できます。移動した距離。したがって、半分に縮小されたオブジェクトは、実際の2倍の距離にあるように見えます。これがすでに最大ビュー距離に近い、または最大ビュー距離にあるオブジェクトに対してのみ実行され、ユーザーに近いオブジェクトが正常にレンダリングされる場合、この手法は目立たないはずです。Zファイティングを削減または完全に排除するために利用される別の手法は、対数Zバッファーに切り替えて、Zを反転させることです。この手法は、ゲーム「グランドセフトオートV」で見られます。浮動小数点数はエンコード方法により、0に近いほど精度が高くなります。ここで、Zを逆にすると、非常に離れたオブジェクトの深さを格納するときの精度が高くなり、Zファイティングが大幅に減少します。

参考文献
^ 「LearnOpenGL-深度テスト」。learnopengl.com 。2021-07-01を取得。
^ 「DepthBufferPrecision-OpenGLWiki」。www.khronos.org 。
^ クレージュ、エイドリアン(2015年11月2日)。「GTAV-グラフィックススタディ」。AdrianCourreges.com 。”