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 如果模具测试通过并且 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

模具缓冲区技术

D3DRENDERSTATETYPE