使用 Higher-Order 基元 (Direct3D 9)

本部分介绍如何在应用程序中使用高阶基元。

确定Higher-Order基元支持

可以查询 D3DCAPS9 结构的 DevCaps 成员,以确定对涉及高阶基元的操作的支持级别。 下表列出了与 Direct3D 9 中高阶基元相关的设备功能。

设备功能 说明
D3DDEVCAPS_NPATCHES 设备支持 N 补丁,并且基于 曲线 PN 三角形 (一种特殊的三次方贝塞尔三角形) 。
D3DDEVCAPS_QUINTICRTPATCHES 设备支持昆特贝塞尔曲线和 B 样条曲线。
D3DDEVCAPS_RTPATCHES 设备支持矩形和三角补丁 (RT 补丁) 。
D3DDEVCAPS_RTPATCHHANDLEZERO 可以使用句柄 0 有效地绘制 RT 补丁。

 

请注意,D3DDEVCAPS_RTPATCHHANDLEZERO并不意味着可以绘制句柄为零的补丁。 无论是否设置此设备功能,始终都可以绘制句柄零补丁。 设置此功能后,硬件体系结构不需要缓存任何信息,并且未缓存的修补程序 (处理零) 绘制与缓存补丁一样高效。

绘图补丁

Direct3D 9 支持两种类型的高阶基元或修补程序。 这些修补程序称为 N 补丁和 Rect/Tri 修补程序。 可以通过调用 IDirect3DDevice9::SetNPatchMode ( nSegments 值大于 1.0 的 nSegments ) ,使用任何三角形呈现调用来呈现 N 补丁。 必须使用以下显式入口点呈现 Rect/Tri 修补程序。

可以使用以下方法来绘制补丁。

IDirect3DDevice9::D rawRectPatch 使用当前设置的流绘制由 pRectPatchInfo 参数指定的矩形高阶修补程序。 Handle 参数用于将修补程序与句柄相关联,以便下次绘制补丁时,无需重新指定 pRectPatchInfo。 这样就可以预先计算和缓存前向差异系数或其他信息,从而允许使用相同的句柄对 IDirect3DDevice9::D rawRectPatch 的后续调用高效运行。

对于静态修补程序,应用程序应设置顶点着色器和适当的流,在 pRectPatchInfo 参数中提供修补程序信息,并指定句柄,以便 Direct3D 可以捕获和缓存信息。 然后,应用程序随后可以调用 IDirect3DDevice9::D rawRectPatch, 并将 pRectPatchInfo 设置为 NULL ,以有效地绘制修补程序。 绘制缓存的修补程序时,将忽略当前设置的流。 但是,可以通过为 pNumSegs 指定新值来替代缓存的 pNumSegs。 此外,在呈现缓存的修补程序时,需要设置与捕获时设置的相同顶点着色器。

对于动态修补程序,每次呈现修补程序时,修补程序数据都会更改,因此缓存信息效率不高。 应用程序可以通过将 Handle 设置为 0 来传达给 Direct3D。 在这种情况下,Direct3D 使用当前设置的流和 pNumSegs 值绘制修补程序,并且不缓存任何信息。 同时将 Handle 设置为 0 和 pPatch 设置为 NULL 无效。

通过为同一句柄重新指定 pRectPatchInfo,应用程序可以覆盖以前缓存的信息。

IDirect3DDevice9::D rawTriPatch 类似于 IDirect3DDevice9::D rawRectPatch ,只不过它绘制了一个三角高阶补丁。

生成法线和纹理坐标

如果使用 (FVF) 着色器的灵活顶点格式,则无法自动生成法线和纹理坐标。

对于法线,可以直接提供它们,也可以让 Direct3D 为你计算它们。

为矩形贴片生成的坐标是基于样条的坐标,如下图所示。

原始纹理以及具有基于样条坐标的纹理的插图

为三角斑块生成的坐标是基于高心样条的坐标,如下图所示。

原始纹理和纹理的插图,其中包含基于主心样条的坐标

如果应用程序必须更改生成的纹理坐标的范围,则可以使用纹理转换来完成此操作。

高阶基元