深度バイアス
3D 空間内で同一平面上にあるポリゴンは、それぞれに z バイアス (深度バイアス) を追加することで、同一平面ではないかのように表示できます。
これは、シーン内のシャドウが正しく表示されるようにするために一般的に使用される手法です。 たとえば、壁の影は、壁と同じ深さの値を持つ可能性があります。 アプリケーションが最初に壁をレンダリングしてから影をレンダリングすると、影が表示されないか、深度アーティファクトが表示される可能性があります。
アプリケーションは、(D3D11_RASTERIZER_DESC1 の DepthBias メンバーから) バイアスを、一連の同一平面ポリゴンのレンダリング時にシステムが使用する z 値に追加することで、同一平面ポリゴンが適切にレンダリングされるようにするのに役立ちます。 z 値が大きいポリゴンは、Z 値が小さいポリゴンの前に描画されます。
深度バイアスを計算するには、2 つのオプションがあります。
出力マージャー ステージに現在バインドされている深度バッファーに UNORM 形式がある場合、または深度バッファーがバインドされていない場合、バイアス値は次のように計算されます。
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
ここで、r は float32 に変換された深度バッファー形式の最小表現可能な値 > 0 です。 DepthBias と SlopeScaledDepthBias の値は、構造体メンバー D3D11_RASTERIZER_DESC1です。 MaxDepthSlope 値は、ピクセルでの深度値の水平方向および垂直方向の傾斜の最大値です。
浮動小数点深度バッファーが出力結合ステージにバインドされている場合、バイアス値は次のように計算されます。
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 値に追加されます。 特徴レベル 10.0 以降を使用する場合、すべてのバイアス計算は 32 ビット浮動小数点演算を使用して実行されます。 バイアスは、ワイヤフレーム モードで描画される線を除き、点または線のプリミティブには適用されません。
シャドウ バッファーベースのシャドウを持つアーティファクトの 1 つは、シャドウ にきび、またはシェーダーの深度計算とシャドウ バッファー内の同じサーフェスの深さのわずかな違いによるサーフェスシャドウ自体です。 これを軽減する 1 つの方法は、シャドウ バッファーをレンダリングするときに DepthBias と SlopeScaledDepthBias を使用する方法です。 シャドウ バッファーのレンダリング中にサーフェスを十分にプッシュして、比較結果 (シャドウ バッファー z とシェーダー z の間) がサーフェス全体で一貫性を保ち、ローカルのセルフシャドウを回避するという考え方です。
ただし、 DepthBias と SlopeScaledDepthBias を使用すると、非常に鋭い角度で表示されたポリゴンによってバイアス方程式が非常に大きな z 値を生成する場合に、新しいレンダリングの問題が発生する可能性があります。 これにより、シャドウ マップ内の元のサーフェスからポリゴンが非常に遠くにプッシュされます。 この特定の問題を軽減する 1 つの方法は、計算される z バイアスの大きさに上限 (正または負) を提供する DepthBiasClamp を使用することです。
注意
機能レベル 9.1、9.2、9.3 では、DepthBiasClamp はサポートされていません。
関連トピック