深度偏差

通过将 z 偏置 (或深度偏差) 添加到 3D 空间中的共面多边形,可以使其看起来像不是共面。

这是一种通常用于确保正确显示场景中的阴影的技术。 例如,墙上的阴影可能具有与墙壁相同的深度值。 如果应用程序先呈现墙,然后呈现阴影,则阴影可能不可见,或者深度项目可能可见。

应用程序可以通过将D3D11_RASTERIZER_DESC1) 的DepthBias 成员的偏差 (添加到系统在呈现共面多边形集时使用的 z 值,来帮助确保正确呈现共面多边形。 z 值较大的多边形将绘制在 z 值较小的多边形前面。

有两个选项可用于计算深度偏差。

  1. 如果当前绑定到输出合并阶段的深度缓冲区采用 UNORM 格式或未绑定深度缓冲区,则偏移值的计算方式如下:

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

    其中 r 是转换为 float32 的深度缓冲区格式中的最小可表示值 > 0。 DepthBiasSlopeScaledDepthBiasD3D11_RASTERIZER_DESC1结构成员。 MaxDepthSlope 值是像素处深度值的水平和垂直斜率的最大值。

  2. 如果浮点深度缓冲区绑定到输出合并阶段,则偏差值的计算方式如下:

    Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) +
                SlopeScaledDepthBias * MaxDepthSlope;
    

    其中 r 是浮点表示形式中的尾数, (不包括隐藏位) ;例如,23 表示 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 位浮点算术执行。 偏差不适用于任何点或线基元,在线框模式下绘制的线条除外。

具有基于阴影缓冲区的阴影的项目之一是阴影粉刺,或者由于着色器中的深度计算与阴影缓冲区中相同表面的深度之间存在细微差异,表面阴影本身。 缓解此问题的一种方法是在呈现阴影缓冲区时使用 DepthBiasSlopeScaledDepthBias 。 其思路是在渲染阴影缓冲区时充分推出表面,以便阴影缓冲区 z 和着色器 z) 之间的比较结果 (在整个图面上保持一致,并避免局部自阴影。

但是,使用 DepthBiasSlopeScaledDepthBias 可能会导致以非常尖锐的角度查看多边形导致偏差方程生成非常大的 z 值时,会出现新的呈现问题。 这实际上会将多边形推离阴影贴图中原始表面的极远。 帮助缓解此特定问题的一种方法是使用 DepthBiasClamp,它根据计算的 z 偏差幅度提供正负) (上限。

注意

对于 功能级别 9.1、9.2、9.3,不支持 DepthBiasClamp

 

输出合并器阶段