Direct3D 11.3 保守光栅化
保守光栅化为像素呈现增加了一些确定性,这特别有助于冲突检测算法。
概述
保守光栅化意味着至少部分覆盖的呈现基元的所有像素都经过光栅化,这意味着调用像素着色器。 正常行为是采样,如果未启用保守光栅化,则不会使用它。
在很多情况下,保守光栅化非常有用,包括在碰撞检测、遮挡剔除和可见性检测方面的确定性。
例如,下图显示了使用保守光栅化呈现的绿色三角形。 棕色区域被称为“不确定性区域”-一个区域,其中舍入错误和其他问题给三角形的确切尺寸增加了一些不确定性。 每个顶点上的红色三角形显示如何计算不确定性区域。 大灰色正方形显示将呈现的像素。 粉红色方块显示使用“左上角规则”呈现的像素,当三角形的边缘越过像素的边缘时,该规则将发挥作用。 可以有误报(不应设置的像素集),系统通常会,但不总是剔除。
与管道的交互
有关保守光栅化与图形管道交互方式的许多详细信息,请参阅 D3D12 保守光栅化。
实现详细信息
Direct3D 12 中支持的光栅化类型有时称为“过度估计的保守光栅化”。 还有“低估的保守光栅化”的概念,这意味着只有呈现基元完全覆盖的像素才会被光栅化。 低估的保守光栅化信息可通过像素着色器通过输入覆盖率数据获得,并且仅过度引入的保守光栅化可用作光栅化模式。
如果基元的任何部分与像素重叠,则认为该像素已覆盖,然后进行光栅化。 当基元的边缘或角沿像素的边缘或角下降时,“左上角规则”的应用特定于实现。 但是,对于支持退化三角形的实现,边缘或角上的退化三角形必须至少覆盖一个像素。
保守光栅化实现在不同硬件上可能有所不同,并且确实会产生误报,这意味着它们可以错误地决定覆盖像素。 这可能是由于特定于实现的详细信息,例如基元增长或贴靠在光栅化中使用的固定点顶点坐标固有的错误。 误报(相对于固定点顶点坐标)有效的原因是,需要一些误报,以便实现对贴靠顶点(即已从浮点转换为光栅器中使用的 16.8 固定点的顶点的顶点坐标)进行覆盖评估,但遵循原始浮点顶点坐标生成的覆盖。
保守光栅化实现不会针对非退化贴靠后基元的浮点顶点坐标生成误报:如果基元的任何部分与像素的任何部分重叠,则将对该像素进行光栅化。
退化的三角形(索引缓冲区中的重复索引或 3D 中的合音线),或在固定点转换后退化(光栅器中的合音顶点),可以或可能不会被剔除:这两者都是有效的行为。 必须将退化的三角形视为背对,因此,如果应用程序需要特定行为,则可以对正面使用后脸剔除或测试。 退化三角形使用分配给顶点 0 的值来表示所有内插值。
除了硬件不支持此功能的可能性外,还有三层硬件支持。
- 第 1 层支持 1/2 像素不确定性区域,并且没有后贴靠后退化。 这适用于平铺呈现、纹理图集、光线贴图生成和子像素阴影地图。
- 第 2 层添加了贴靠后退化和 1/256 不确定性区域。 它还增加了对基于 CPU 的算法加速(如体素化)的支持。
- 第 3 层添加了 1/512 不确定性区域、内部输入覆盖率并支持遮挡剔除。 输入覆盖率将新值
SV_InnerCoverage
添加到高级底纹语言(HLSL)。 这是一个 32 位标量整数,可以在像素着色器的输入上指定,并表示低估的保守光栅化信息(即是否保证像素-to-be完全覆盖)。
API 摘要
以下方法、结构、枚举和帮助程序类引用保守光栅化:
- D3D11_RASTERIZER_DESC2:保存光栅器说明的结构,指出用于创建光栅器说明的CD3D12_RASTERIZER_DESC2帮助程序类。
- D3D11_CONSERVATIVE_RASTERIZATION_MODE:模式的枚举值(打开或关闭)。
- D3D11_FEATURE_DATA_D3D11_OPTIONS2:包含支持层的结构。
- D3D11_CONSERVATIVE_RASTERIZATION_TIER:硬件支持的每个层的枚举值。
- ID3D11Device::CheckFeatureSupport:访问支持的功能的方法。