在 3D 空間中共同平面的多邊形,可以藉由將 z 偏差(或深度偏差)新增至每一個多邊形,使其看起來像不是共同平面。
這是一種通常用來確保場景中的陰影正確顯示的技術。 例如,牆上的陰影可能會有與牆相同的深度值。 如果應用程式先轉譯牆,然後呈現陰影,則陰影可能無法看見,或可能會顯示深度成品。
應用程式可以藉由將偏差(從 DepthBias 成員 D3D11_RASTERIZER_DESC1)新增至系統在轉譯共同平面多邊形多邊形集合時所使用的 z 值,以協助確保共面多邊形的轉譯正確。 具有較大 z 值的多邊形將會以較小的 z 值繪製在多邊形前面。
計算深度偏差有兩個選項。
如果目前系結至輸出合併階段的深度緩衝區具有 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 是浮點表示法中的 mantissa 位數(不包括隱藏位):例如,23 for float32。
偏差值接著會像這樣加以限制:
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 位浮點算術來執行。 除了以線框模式繪製的線條以外,偏差不會套用至任何點或線條基本類型。
其中一個具有陰影緩衝區陰影的成品是陰影瘡,或表面陰影本身,因為著色器中的深度計算與陰影緩衝區中相同表面的深度有輕微差異。 緩解此狀況的其中一種方法,是在轉譯陰影緩衝區時,使用 depthBias 和 SlopeScaledDepthBias。 其概念是在轉譯陰影緩衝區時,將表面推送到足夠的位置,讓比較結果(陰影緩衝區 z 與著色器 z 之間)在整個表面保持一致,並避免局部自我遮蔽。
不過,使用 DepthBias 和 SlopeScaledDepthBias,當以極尖角檢視的多邊形會導致偏差方程式產生非常大的 z 值時,可能會造成新的轉譯問題。 這實際上會將多邊形與陰影圖中的原始表面相去甚遠。 協助緩解此特定問題的其中一種方法是使用 DepthBiasClamp,這會在計算的 z 偏差大小上提供上限(正或負數)。
注意
不支援 功能層級 9.1、9.2、9.3、DepthBiasClamp。
相關主題