修改顶点流频率

支持顶点着色器版本 3.0 及更高版本的设备的 DirectX 9.0 版本驱动程序必须实现顶点流频率除法。 对于 2.0 版及更早版本的顶点着色器 (包括固定函数) ,每个顶点调用一次顶点着色器;对于每个调用,输入顶点寄存器使用顶点流中的唯一顶点元素进行初始化。 但是,使用顶点流频率除法,可以调用 (3.0 及更高版本的顶点着色器) ,以不太频繁的速率初始化适用的输入寄存器。

当应用程序调用 IDirect3DDevice9::SetStreamSourceFreq 方法以设置给定流的频率时,DirectX 9.0 运行时反过来使用D3DDP2OP_SETSTREAMSOURCEFREQ操作代码调用驱动程序的 D3dDrawPrimitives2 函数。

将流的频率除数(例如设置为 2)后,驱动程序必须从流中提取数据,并每隔 2 个顶点将此数据传递到适用的输入顶点寄存器。 此除数会影响流中的每个元素。

驱动程序使用此除数根据以下公式计算顶点缓冲区中的顶点偏移量:

VertexOffset = VertexIndex / Divider * StreamStride + StreamOffset 

对于使用的每个顶点流,如果驱动程序在使用 D3DDP2OP_DRAWPRIMITIVE 操作代码调用驱动程序的 D3dDrawPrimitives2 函数期间收到起始顶点值,则驱动程序还会将此起始顶点值除以频率除数,并在公式中对结果进行系数。 此起始顶点值在 D3DHAL_DP2DRAWPRIMITIVE 结构的 VStart 成员中提供。 开始顶点值中的以下公式因素:

VertexOffset = StartVertex / Divider + 
               VertexIndex / Divider * StreamStride + StreamOffset 

请注意,上述公式使用整数除法。

应用程序在调用 IDirect3DDevice9::CreateStateBlock 方法时传递D3DSBT_VERTEXSTATE状态类型,以捕获当前顶点状态。

对于索引基元,或者驱动程序仅支持早于版本 3.0 的顶点着色器模型 (包括固定函数) ,驱动程序将忽略流的频率除数的设置。

有关 IDirect3DDeviceXxx::SetStreamSourceFreqIDirect3DDeviceXxx::CreateStateBlock 的详细信息,请参阅最新的 DirectX SDK 文档。