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