请升级到MicrosoftEdge以使用最新的功能、安全更新和技术支持。
保守光栅化为像素渲染增加了一定的确定性,这对碰撞检测算法特别有帮助。
保守光栅化是指将至少由渲染基元部分覆盖的所有像素光栅化,同时也意味着会调用像素着色器。正常行为是采样,而启用保守光栅化时不使用采样。
在许多情况下,保守光栅化非常有用,包括在碰撞检测、遮挡剔除和图块式渲染中实现确定性。
例如,下图显示了一个使用保守光栅化渲染的绿色三角形,它的外观与在光栅器中相同(使用16.8定点顶点坐标)。褐色区域称为“不确定性区域”-表示三角形扩展边界的概念性区域,需确保光栅器中的基元相对于原始浮点顶点坐标而言是保守的。每个顶点上的红色方块显示如何计算不确定性区域:扫描方块。
灰色的大方块显示要渲染的像素。粉红色方块显示使用“左上规则”渲染的像素。当三角形的边缘越过像素的边缘时,将应用该规则。在正常情况下,系统可能会剔除某些误报(设置了原本不应该设置的像素),但不一定总会剔除。
在保守光栅化模式下,应用光栅化规则的方式与未启用保守光栅化模式时相同,但对于上述“左上规则”和“像素覆盖”例外。必须使用16.8定点光栅器精度。
对于硬件使用完整浮点顶点坐标时不会覆盖的像素,仅当这些像素位于不大于定点域中像素的一半的不确定性区域内时,才可以包含这些像素。将来的硬件有望达到第2层中指定的紧密不确定性区域。请注意,此要求会阻止银色三角形进一步扩展为超过所需的大小。
内部和外部不确定性区域必须大于或等于定点域中的子像素网格大小的一半,或某个像素的1/512。这是最小的有效不确定性区域。1/512取自16.8定点光栅器坐标表示形式,以及将浮点顶点坐标转换为16.8定点坐标时应用的近似值舍入规则。如果光栅器精度发生变化,1/512可能会变化。如果某个实现实现此最小不确定性区域,当不确定性区域的某个边或角落在某个像素的边或角上时,这些值必须遵循左上规则。应将不确定性区域的裁剪边视为最靠近的顶点,即,将它算作两条边:在关联的顶点上联接的两条边。使用最小的不确定性区域时需要应用左上规则,否则,保守光栅化实现无法光栅化当禁用保守光栅化模式时可能覆盖的像素。
下图演示了扫描围绕定点域中基元边缘(即,顶点已由16.8定点表示形式量化)的方块后生成的有效外部不确定性区域。此方块的维度基于有效的外部不确定性区域大小:对于像素的1/2,此方块的宽度和高度是1个像素;对于像素的1/512,此方块的宽度和高度是1/256个像素。绿色三角形表示给定的基元,红色虚线表示绑定在高估保守光栅化绑定中,纯黑色方块表示沿基元边缘扫描,蓝色棋盘区域是外部不确定性区域:
无论RenderTarget/DepthStencil图面中的样本数(,或者是否)使用ForcedSampleCount,保守光栅化光栅化的像素都会覆盖所有样本。无论各个样本位置是否在基元范围内,都不会对其进行测试。
针对保守光栅化的像素继续处理深度/模具测试的方式,与针对未启用保守光栅化时覆盖的所有样本的处理方式相同。
继续处理所有覆盖的样本可能会导致有效的深度外插,必须将深度外插钳接到未启用保守光栅化时指定的视区。这类似于对样本计数大于1的RenderTarget使用像素频率内插模式,不过,对于保守光栅化,它是进入可以外插的固定函数深度测试的深度值。
使用深度外插时的提前深度剔除行为是不确定的。这是因为某些提前深度剔除硬件无法正常支持外插的深度值。但是,即使硬件能够支持外插的深度值,使用深度外插时的提前深度剔除行为也会出现问题。可以通过将像素着色器钳接到所要光栅化的基元的最小和最大深度值,并将该值写入oDepth(像素着色器输出深度寄存器),来解决此问题。由于oDepth写入,在此情况下,实现必须禁用提前深度剔除。
应用帮助器像素规则的方式与未启用保守光栅化时相同。在此过程中,所有像素(包括帮助器像素)必须根据InputCoverage交互部分中的指定准确报告InputCoverage。因此,完全未覆盖的像素将报告0覆盖度。
保守光栅化像素的输出覆盖(oMask)行为与未对所有样本启用保守光栅化时相同。
在保守光栅化模式下,填充此输入寄存器的方式如同未针对给定保守光栅化像素启用保守光栅化时覆盖了所有样本时一样。也就是说,所有现有交互都(例如SampleMask应用于),并且对于保守光栅化像素,LSB中的InputCoverage前n个位设置为1,给定在输出合并处绑定的每个像素RenderTarget和/或DepthStencil缓冲区的n个样本,或一个n个示例ForcedSampleCount。余下的位均为0。
无论是否使用保守光栅化,此输入在着色器中均可用,不过,保守光栅化会改变其行为,只显示所有覆盖的样本(或者不显示帮助器像素的任何样本)。
此功能对于第3层是必需的,并且只能在第3层中使用。如果实现支持低于第3层的层,则运行时无法为使用此模式的着色器创建着色器。
像素着色器可以使用一个32位标量整数“系统生成值”:InnerCoverage。仅当保证像素完全位于当前基元中时,此位域才包含给定保守光栅化像素的、设置为1的LSB中的位0。未设置位0时,必须将所有其他输入寄存器位设置为0,但是,当位0设置为1时,这些寄存器位是不确定的(本质上,此位域表示一个布尔值,false必须确切地为0,但true可以是任何奇数(即已设置0位)非零值)。此输入用于低估的保守光栅化信息。它告知像素着色器当前像素是否完全位于几何体内。
当分辨率大于或等于运行当前绘图操作时的分辨率时,必须将此算作贴靠错误。不得出现误报(由于分辨率大于或等于运行当前绘图操作时的分辨率而出错,因此未完全覆盖像素时设置InnerCoverage位),但允许漏报。总而言之,实现不得错误地将像素标识为完全已覆盖,否则光栅器中不会使用完整的浮点顶点坐标。
对于硬件使用完整浮点顶点坐标时完全覆盖的像素,仅当它们与内部不确定性区域相交时,才能将其忽略。在这种情况下,该区域不得大于定点域中的子像素网格的大小,或某个像素的1/256。换句话说,完全位于内部不确定性区域边界内的像素必须标记为完全已覆盖。下图中的粗黑虚线演示了不确定性区域的内部边界。1/256取自16.8定点光栅器坐标表示形式,如果光栅器精度发生变化,此值可能也会变化。此不确定性区域足以应对在光栅器中将浮点顶点坐标转换为定点顶点坐标导致的贴靠错误。
在光栅化规则交互中定义的1/512最小不确定性区域要求在此处也同样适用。
下图演示了扫描围绕定点域中基元边缘(即,顶点已由16.8定点表示形式量化)的方块后生成的有效内部不确定性区域。此方块的维度基于有效的内部不确定性区域大小:对于像素的1/256,此方块的宽度和高度为1/128个像素。绿色三角形表示给定的基元,粗黑虚线表示内部不确定性区域的边界,纯黑色方块表示沿基元边缘扫描的方块,橙色棋盘区域是内部不确定性区域:
使用InnerCoverage不会影响是否对像素进行保守光栅化,即,在启用保守光栅化模式的情况下使用其中一种InputCoverage模式不会影响到要光栅化哪些像素。因此,如果使用InnerCoverage并且像素着色器正在处理未完全由几何体覆盖的像素,则其值为0,但是,像素着色器调用的样本将会更新。这是不同于InputCoverage为0的情况,后者表示不更新任何样本。
此输入与InputCoverage互斥:不能同时使用两者。
InnerCoverage位域不受深度/模具测试的影响,也不会通过AND运算符与SampleMask光栅器状态合并。
此输入仅在保守光栅化模式下有效。如果未启用保守光栅化,InnerCoverage会生成不确定的值。
需要使用帮助器像素,否则不会由基元覆盖的像素着色器调用的InnerCoverage寄存器必须设置为0。
属性内插模式将保持不变,其处理方式与未启用保守光栅化(使用视区缩放和定点转换的顶点)时相同。由于保守光栅化像素中的所有样本均被视为已覆盖,因此,它对于外插的值是有效的,类似于对样本计数大于1的RenderTarget使用像素频率内插模式。质心内插模式生成的结果与相应的非质心内插模式相同;在此情况下,质心的概念没有意义–其中的样本覆盖度为“完全”或为0。
保守光栅化允许退化三角形生成像素着色器调用,因此,退化三角形必须使用为所有内插值的顶点0分配的值。
启用保守光栅化模式时,裁剪距离是有效的,保守光栅化像素的行为与在覆盖所有样本的情况下未启用保守光栅化时相同。
请注意,保守光栅化可能会导致W顶点坐标外推,这可能会导致W<=0。这可能导致按像素裁剪距离实现在透视除以无效W值的裁剪距离上运行。剪辑距离实现必须防止对顶点坐标W<=0(像素调用光栅化,例如,在保守光栅化模式下)由于推断。
保守光栅化模式与目标独立的光栅化(TIR)兼容。TIR规则和限制适用,保守光栅化像素的行为与覆盖所有样本时相同。
未为线条或点基元定义保守光栅化。因此,如果在启用保守光栅化的情况下将指定点或线条的基元拓扑馈送到光栅器单元,这些拓扑会产生不确定的行为。
调试层验证会验证应用程序是否未使用这些基元拓扑。
每次在保守保守光栅化模式下以保守方式像素化像素,像素着色器调用都应该递增。
所有剔除状态在保守光栅化模式下有效,遵循的规则与未启用保守光栅化时相同。
IsFrontFace系统生成值可在保守光栅化模式下使用,遵循未启用保守光栅化时定义的行为。
这是因为,D3D12功能规范指定线框填充模式应将三角形的边转换为线条,并遵循线条光栅化规则,而保守线条光栅化行为尚未定义。
Direct3D12支持的光栅化类型有时称为“高估保守光栅化”。此外还存在“低估保守光栅化”的概念,表示仅光栅化未由渲染基元完全覆盖的像素。可以使用输入覆盖数据通过像素着色器获取低估保守光栅化信息,只有高估保守光栅化作为光栅化模式提供。
如果基元类型的任何组成部分与某个像素重叠,该像素将被视为已覆盖,然后光栅化。如果基元的边或角落在像素的边或角上,则“左上规则”的应用将根据实现而定。但是,对于支持退化三角形的实现,边或角上的退化三角形必须至少覆盖一个像素。
对于非退化后期贴靠基元的浮点顶点坐标,保守光栅化实现不会生成漏报:如果基元的任何组成部分与某个像素的任何组成部分重叠,则会光栅化该像素。
退化的(索引缓冲区中出现重复索引,或3D中出现共线)或者在定点转换后退化的(光栅化器中出现共线顶点)的三角形不一定会被剔除;两者都是有效的行为。必须将退化三角形视为朝向背面,因此,如果应用程序需要特定的行为,可以使用背面剔除,或者对正面朝向进行测试。退化三角形使用为所有内插值的顶点0分配的值。