Two-Sided 模具 (Direct3D 9)

阴影卷用于在模具缓冲区中绘制阴影。 应用程序通过遮挡几何图形计算阴影卷大小,方法是计算剪影边缘并将它们从光线中挤压到一组 3D 卷中。 然后,这些卷将两次渲染到模具缓冲区中。

第一次渲染绘制前向多边形,并增加模具缓冲区值。 第二次渲染绘制阴影卷的后向多边形,并减少模具缓冲区值。 通常,所有增加和减少值会相互抵消。但是,由于阴影卷已被渲染,使用常规几何图形渲染的场景会导致部分像素无法通过 z 缓冲测试。 留在模具缓冲区的值域阴影中像素相对应。 使用这些保留的模具缓冲区内容作为掩码,以在场景中 alpha 混合大面积、全环绕的黑色间隙。 将模具缓冲区作为掩码,结果是将位于阴影处的像素变暗。

这意味着每个光源的阴影几何图形将绘制两次,因此为 GPU 的顶点吞吐量带来了压力。 双面模具功能旨在缓解此问题。 这种方法使用两组模具状态(如下文所列),一组用于前向三角形,另一组用于后向三角形。 这样,每个阴影卷每个光源只需绘制一次。

API 更改仅限于一组新的呈现状态。 新的呈现状态D3DRS_Two_Sided_StencilMODE可以设置为 TRUEFALSE。 默认为 FALSE ,表示当前 (DirectX 8) 行为。 如果设置为 TRUE (则仅当D3DSTENCILCAPS_TWOSIDED设置为) 时,以下呈现状态将仅适用于正面 (顺时针) 三角形。

呈现状态 说明
D3DRS_STENCILFAIL D3DSTENCILOP 在模具测试失败时执行。
D3DRS_STENCILZFAIL D3DSTENCILOP 在模具测试通过且 z 测试失败时执行。
D3DRS_STENCILPASS 如果模具和 z 测试都通过,则为 D3DSTENCILOP。
D3DRS_STENCILFUNC D3DCMPFUNC fn. 如果 ( (ref & 掩码) 模具 (模具掩码) ) 为 true,则模具 & 测试通过。

 

一组新的呈现状态应用于逆时针 () 三角形的背面。

呈现状态 说明
D3DRS_CCW_STENCILFAIL D3DSTENCILOP 在模具测试失败时执行。
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP 在模具测试通过且 z 测试失败时执行。
D3DRS_CCW_STENCILPASS 如果模具和 z 测试都通过,则为 D3DSTENCILOP。
D3DRS_CCW_STENCILFUNC D3DCMPFUNC 函数。 如果 ( (ref & 掩码) 模具 (模具掩码) ) 为 true,则 & 模具测试通过。

 

剩余的模具呈现状态始终适用于顺时针和逆时针三角形。

对于线条和点子画面,将忽略D3DRS_Two_Sided_StencilMODE,这意味着行为与 DirectX 8 相比保持不变。 将忽略D3DRS_CCW_STENCIL* 呈现状态。

新的上限位指示设备是否支持此功能。 不支持此功能的驱动程序应忽略这些新的呈现状态。 所有其他模具上限位适用于这两种模具缓冲模式。 由于Two_Sided_Stencil意味着能够使用D3DCULLMODE_NONE集进行绘制,因此如果驱动程序支持此新模具模式,则必须由驱动程序设置相应的上限。 Microsoft Windows 硬件质量实验室 (WHQL) 应强制实施此规定。

新的呈现状态:

D3DRS_Two_Sided_StencilMODE // BOOL (default is FALSE)
D3DRS_CCW_STENCILFAIL     // Same default as D3DRS_STENCILFAIL
D3DRS_CCW_STENCILZFAIL    // Same default as D3DRS_STENCILZFAIL
D3DRS_CCW_STENCILPASS     // Same default as D3DRS_STENCILPASS
D3DRS_CCW_STENCILFUNC     // Same default as D3DRS_STENCILFUNC

新上限:

D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

模具缓冲区技术

D3DRENDERSTATETYPE