使用 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。 若要更好地了解如何在顶点缓冲区中引用修补程序数据,请参阅 D3DRECTPATCH_INFO。
- IDirect3DDevice9::D rawTriPatch。 若要更好地了解如何在顶点缓冲区中引用修补程序数据,请参阅 D3DTRIPATCH_INFO。
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 为你计算它们。
为矩形贴片生成的坐标是基于样条的坐标,如下图所示。
为三角斑块生成的坐标是基于高心样条的坐标,如下图所示。
如果应用程序必须更改生成的纹理坐标的范围,则可以使用纹理转换来完成此操作。
相关主题