パースイメージを実行していて、モデルに暗黙の交差がある場合、「線形Z」を使用すると、それらの交差が間違った場所に表示されます。
たとえば、電柱の列があり、遠くに後退し、地面を突き抜けている(そして下に続く)単純な地面を考えてみましょう。暗黙的な交差は、補間された深度値によって決定されます。それらがで補間されていない1/Z
場合、投影された頂点が遠近法で計算されていると、画像は正しく表示されません。
以下のイラストの非美的品質をお詫び申し上げますが、私はそれらを'97年に戻しました。
最初の画像は、必要なレンダリング効果を示しています。(青い「パイロン」は地面の下にかなり長い距離を移動するため、画像の下部で切り取られていることに注意してください)
この2番目の画像は、非相互深度バッファーを使用した結果を示しています。
ご覧のとおり、結果は正しくありません。
別のメモでは、本当にあなたが線形のZ表現を本当に望んでいるのですか?遠近法でレンダリングしている場合、確かに遠方よりもカメラに近い方の精度が必要ですか?
後のコメントについて:
「それらが1 / Zで補間されていない場合」私には理解できません。それは何の補間ですか?
最初に注意する点は、標準の透視投影では、ワールド空間の直線は透視空間の直線のままであることです。ただし、距離/長さは保持されません。
簡単にするために、簡単な透視変換を使用して頂点を投影すると仮定します。
バツSc r e e n=バツWo r l dZWo r l d
YSc r e e n=YWo r l dZWo r l d
我々はすべきも相互のスクリーン空間の深さを計算し、例えばZSc r e e n=1ZWo r l d
しかし、深度バッファの線形Zには、次のようなものが必要です。 ZSc r e e n= s c a l e ∗ZWo r l d
(ここでは、scale = 1と想定できます)
ワールドスペースの終点を持つラインがあるとしましょう⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢200010⎤⎦⎥
これらのマップをスクリーンスペース座標にマッピングするパースペクティブ
⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢2000.1⎤⎦⎥
レンダリングシステム/ハードウェアは、画面スペースzを線形補間するため、ラインの1/2ウェイポイントで、画面上に表示されるため、つまりピクセル(10、0)で、投影された(逆)Zを取得します。値は0.55です。これは、ワールドスペースのZ値が〜1.818に相当します。開始Z値と終了Z値を指定すると、これは線の長さに沿って約20%です。
代わりに、元のZ値を使用して補間しようとした場合、Zはワールドスペース値5.5に対応することになります。何も交差しない限り、あなたは大丈夫かもしれませんが(私はそれについて徹底的に考えていませんでした)、暗黙の交差を持つものはすべて正しくありません。
私が言及しなかったことは、パースペクティブ補正テクスチャリング(またはパースペクティブ補正シェーディングさえ)を導入したら、1 / wのピクセルごとの補間を実行し、さらに、その補間された値の逆数をピクセルごとに計算する必要があることです。
far / z
標準的な線形によるからのスケーリングは意味がありません。これにより、2つのクリップ面が互いに近づくほど線形になる深度バッファが生成されます。これは、画面空間リニアZとパフォーマンスハックのための非一定の深度バッファマッピングという2つの概念の融合のようです。