深度偏差

在 3D 空間中共平面的多邊形,可以藉由將 z 偏差 (或深度偏差) 新增至每一個平面,使其顯示為不共平面。

這是通常用來確保場景中的陰影正確顯示的技術。 例如,牆上的陰影可能會有與牆相同的深度值。 如果應用程式先轉譯牆,然後再轉譯陰影,則陰影可能無法顯示,或可能會顯示深度成品。

應用程式可藉由將D3D11_RASTERIZER_DESC1) 的 DepthBias成員的偏差 (新增至系統在轉譯平面多邊形集合時所使用的 z 值,協助確保共同平面多邊形會正確轉譯。 具有較大 z 值的多邊形將會在多邊形前面繪製,且 z 值較小。

計算深度偏差有兩個選項。

  1. 如果目前系結至輸出合併階段的深度緩衝區具有 UNORM 格式或未系結深度緩衝區,則會計算偏差值,如下所示:

    Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
    

    其中r是轉換成float32的深度緩衝區格式中可表示的 > 最小值 0。 DepthBiasSlopeScaledDepthBias是D3D11_RASTERIZER_DESC1結構成員。 MaxDepthSlope值是圖元深度值的水準和垂直斜率上限。

  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 值。 當您使用 特徵層級 10.0 和更新版本時,所有偏差計算都會使用 32 位浮點算術來執行。 偏差不會套用至任何點或線條基本類型,但線框模式中繪製的線條除外。

其中一個具有陰影緩衝區型陰影的成品是陰影陰影,或因為著色器中深度計算與陰影緩衝區中相同表面的深度有微差異,而表面陰影本身。 減輕此情況的其中一個方法是在轉譯陰影緩衝區時使用 DepthBiasSlopeScaledDepthBias 。 概念是在轉譯陰影緩衝區時將表面推送到足夠,讓陰影緩衝區 z 與著色器 z) 之間的比較結果 (在表面之間保持一致,並避免本機自我陰影。

不過,使用 DepthBiasSlopeScaledDepthBias 可在以極尖角檢視的多邊形造成偏差方程式產生非常大的 z 值時,引入新的轉譯問題。 這實際上會讓多邊形與陰影圖中的原始表面非常遠。 協助減輕這種特定問題的其中一種方法是使用 DepthBiasClamp,其會針對計算的 z 偏差大小提供上限 (正數或負) 。

注意

對於 功能層級 9.1、9.2、9.3,不支援 DepthBiasClamp

 

輸出合併階段