阴影卷用于使用模具缓冲区绘制阴影。 应用程序通过遮挡几何图形计算阴影卷,计算剪影边缘并将其从光线延伸到一组 3D 卷中来计算阴影卷。 然后将这些卷呈现两次到模具缓冲区中。
第一个呈现绘制正向多边形,并递增模具缓冲区值。 第二个呈现绘制阴影卷的背对多边形,并递减模具缓冲区值。 通常,所有递增和递减的值都会相互取消。但是,场景已使用普通几何图形呈现,导致某些像素在呈现阴影卷时失败 z 缓冲区测试。 模具缓冲区中左侧的值对应于阴影中的像素。 这些剩余的模具缓冲区内容用作掩码,以 alpha 将一个大的全包含黑色象限混合到场景中。 模具缓冲区充当掩码时,结果是阴影中的像素变暗。
这意味着每个光源绘制两次阴影几何图形,从而给 GPU 的顶点吞吐量施加压力。 双面模具功能旨在缓解这种情况。 在此方法中,有两组模具状态(如下所示),一组分别用于正面三角形,另一组用于后向三角形。 这样,每个阴影卷(每光)只绘制一个通道。
API 更改仅限于一组新的呈现状态。 新的呈现状态D3DRS_Two_Sided_StencilMODE可以设置为 TRUE 或 FALSE。 它默认 FALSE,这意味着当前 (DirectX 8) 行为。 如果此值设置为 TRUE(仅在设置D3DSTENCILCAPS_TWOSIDED时才起作用),以下呈现状态将仅适用于正面(顺时针)三角形。
呈现状态 | 描述 |
---|---|
D3DRS_STENCILFAIL | 如果模具测试失败,D3DSTENCILOP执行此作。 |
D3DRS_STENCILZFAIL | 如果模具测试通过并且 z 测试失败,则D3DSTENCILOP执行此作。 |
D3DRS_STENCILPASS | 如果模具和 z 测试都通过,D3DSTENCILOP执行此作。 |
D3DRS_STENCILFUNC | D3DCMPFUNC fn. 模具测试通过(ref & mask)模具(模具 & 掩码)是否为 true。 |
新的呈现状态集适用于后置(逆时针)三角形。
呈现状态 | 描述 |
---|---|
D3DRS_CCW_STENCILFAIL | 如果模具测试失败,D3DSTENCILOP执行此作。 |
D3DRS_CCW_STENCILZFAIL | 如果模具测试通过并且 z 测试失败,则D3DSTENCILOP执行此作。 |
D3DRS_CCW_STENCILPASS | 如果模具和 z 测试都通过,D3DSTENCILOP执行此作。 |
D3DRS_CCW_STENCILFUNC | D3DCMPFUNC函数。 模具测试通过(ref & mask)模具(模具 & 掩码)是否为 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
相关主题