Two-Sided 模具 (Direct3D 9)
阴影卷用于在模具缓冲区中绘制阴影。 应用程序通过遮挡几何图形计算阴影卷大小,方法是计算剪影边缘并将它们从光线中挤压到一组 3D 卷中。 然后,这些卷将两次渲染到模具缓冲区中。
第一次渲染绘制前向多边形,并增加模具缓冲区值。 第二次渲染绘制阴影卷的后向多边形,并减少模具缓冲区值。 通常,所有增加和减少值会相互抵消。但是,由于阴影卷已被渲染,使用常规几何图形渲染的场景会导致部分像素无法通过 z 缓冲测试。 留在模具缓冲区的值域阴影中像素相对应。 使用这些保留的模具缓冲区内容作为掩码,以在场景中 alpha 混合大面积、全环绕的黑色间隙。 将模具缓冲区作为掩码,结果是将位于阴影处的像素变暗。
这意味着每个光源的阴影几何图形将绘制两次,因此为 GPU 的顶点吞吐量带来了压力。 双面模具功能旨在缓解此问题。 这种方法使用两组模具状态(如下文所列),一组用于前向三角形,另一组用于后向三角形。 这样,每个阴影卷每个光源只需绘制一次。
API 更改仅限于一组新的呈现状态。 新的呈现状态D3DRS_Two_Sided_StencilMODE可以设置为 TRUE 或 FALSE。 默认为 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
相关主题