深度バイアス

3D 空間の同一平面上にあるポリゴンは、それぞれに z バイアス (または深度バイアス) を追加することで、同一平面上に存在しないかのように表示することができます。この方法は一般に、シーン内の影を適切に表示するために使用されます。たとえば、壁に映った影の深度値が、壁と同じである可能性があります。アプリケーションで最初に壁をレンダリングした後、影をレンダリングする場合、影が表示されなかったり、深度の不自然な効果が現れたりすることがあります。

アプリケーションでは、同一平面上のポリゴンをレンダリングするときに使用される z 値に (D3D10_RASTERIZER_DESC の DepthBias メンバーの) バイアスを追加することによって、同一平面上のポリゴンを適切にレンダリングすることができます。z 値が大きいポリゴンは、z 値が小さいポリゴンの手前に描画されます。

深度バイアスを計算するには、次の 2 つの方法があります。

  1. 現在、出力結合ステージにバインドされている深度バッファーが UNORM フォーマットの場合、または深度バッファーがバインドされていない場合、バイアス値は次のように計算されます。
    
    Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
    
    
    r は、float32 に変換される、深度バッファー フォーマットの表現可能な最小値 (> 0) です。他の値は、構造体のメンバーです。
  2. 浮動小数点の深度バッファーが出力結合ステージにバインドされている場合、バイアス値は次のように計算されます。
    
    Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) +
                SlopeScaledDepthBias * MaxDepthSlope;
    
    
    r は、浮動小数点表現の仮数ビットの数です (隠しビットを除きます)。たとえば、float32 の場合は 23 です。

続いて、バイアス値は次のようにクランプされます。


if(DepthBiasClamp > 0)
    Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
    Bias = max(DepthBiasClamp, Bias)

続いて、バイアス値は、ピクセル深度を計算するために使用されます。


if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
    z = z + Bias

深度バイアスの処理は、クリッピング後に頂点に対して実行されるため、深度バイアスはジオメトリのクリッピングには影響しません。バイアス値は特定のプリミティブについて一定で、インターポレータの設定前に各頂点の z 値に追加されます。バイアスの計算はすべて、32 ビット浮動小数点演算を使用して実行されます。バイアスは、ワイヤフレーム モードで描画された線を除き、点または線プリミティブには適用されません。

シャドウ バッファーを使用した影で発生する不自然な効果の 1 つに、シャドウ アクネ (影にできるまだら模様)、つまり、シェーダーの深度計算とシャドウ バッファーの同じサーフェスの深度との小さな差によるサーフェスの自己シャドーイングがあります。これを軽減する方法の 1 つとして、シャドウ バッファーのレンダリング時に DepthBias および SlopeScaledDepthBias を使用する方法があります。この意図は、シャドウ バッファーのレンダリング時にサーフェスを十分に押し出すというものです。これにより、(シャドウ バッファー z とシェーダー z 間の) 比較結果がサーフェス全体で一致し、局所的な自己シャドーイングが回避されます。

ただし、DepthBias と SlopeScaledDepthBias の使用によって、ポリゴンを極端な鋭角で表示すると、バイアスの式によって非常に大きい z 値が生成されるという新たなレンダリングの問題が生じる可能性があります。この結果、実質的に、シャドウ マップ内の元のサーフェスから極端に離れた位置にポリゴンが押し出されます。この特有の問題を軽減するのに役立つ方法の 1 つとして、DepthBiasClamp を使用する方法があります。これによって、計算される z バイアスの大きさに関する (正または負の) 上限が指定されます。

関連項目

出力結合ステージ (Direct3D 10)

表示: