将 FVF 代码映射到 Direct3D 9 声明 (Direct3D 9)

此表将 FVF 代码映射到 D3DVERTEXELEMENT9 结构。

FVF 数据类型 使用情况 使用情况索引
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5和D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3、D3DVSDT_FLOAT4、D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5和D3DFVF_LASTBETA_D3DCOLOR D3DVSDT_FLOAT3、D3DVSDT_FLOAT4、D3DVSDT_D3DCOLOR D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT4、D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOATn D3DDECLUSAGE_POSITION,D3DDECLUSAGE_BLENDWEIGHT 0
D3DFVF_XYZBn (n=1..4) 和 D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT (n-1) 、D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) 和 D3DFVF_LASTBETA_D3DCOLOR D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT (n-1) 、D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_NORMAL D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 0
D3DFVF_PSIZE D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_PSIZE 0
D3DFVF_DIFFUSE D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 0
D3DFVF_SPECULAR D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 1
D3DFVF_TEXCOORDSIZEm (n) D3DDECLTYPE_FLOATm D3DDECLUSAGE_TEXCOORD n

 

带有D3DDECLUSAGE_POSITIONT的顶点声明

存在具有 (D3DUSAGE_POSITIONT, 0) 的顶点元素用于向设备指示传入的顶点数据已通过顶点处理 ((如 FVF,) 设置了D3DFVF_XYZRHW位)。 在绘制时,如果当前设置的声明具有 (D3DUSAGE_POSITIONT 0) 语义的元素,则会跳过整个顶点处理 (就像) 设置了具有D3DFVF_XYZRHW位的 FVF 一样。

(D3DDECLUSAGE_POSITIONT、0) 顶点声明存在一些限制:

  • 此类声明中只能使用流 0。
  • 必须通过增加流偏移量对顶点元素进行排序。
  • 流偏移量必须与 DWORD 对齐。
  • 相同的 (使用情况、使用情况索引) 对应仅列出一次。
  • 只能使用 D3DDECLMETHOD_DEFAULT 方法。
  • 其他顶点元素不能具有 (D3DDECLUSAGE_POSITION 0) 语义。

此外,与设备驱动程序版本相关的此类声明存在一些限制。 这些限制之所以有效,是因为 Direct3D 将此类声明直接发送到驱动程序,而无需执行任何转换。

不带D3DDECLUSAGE_POSITIONT的顶点声明

运行时验证声明的创建。 以下是关于哪些声明是合法的一般规则。

  • 流的所有顶点元素必须是连续的,并且按偏移量排序。
  • 流偏移量必须与 DWORD 对齐。
  • 相同的 (使用情况、使用情况索引) 对应仅列出一次。
  • 如果设置了D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET,则
    • 多个顶点元素可以在流中共享相同的偏移量。
    • 顶点元素可以是不同的类型,可以有不同的大小。
    • 顶点元素可以任意重叠。 例如,一个元素可以从同时位于另一个元素中间的流的某个位置开始。
    • 允许顶点元素按任意顺序进行流偏移。
  • 顶点元素数不能大于 64。
  • UsageIndex 应位于 [0-15] 范围内。
  • 与 DrawPrimitive API 一起使用的声明不应具有除D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_LOOKUPPRESAMPLED或D3DDECLMETHOD_LOOKUP以外的顶点元素。
  • 声明(包含 D3DDECLMETHOD_LOOKUP 或 LOOKUPPRESAMPLED)应仅与可编程顶点管道一起使用。
  • 与 DrawRectPatch/DrawTriPatch API 一起使用的声明不能具有具有D3DDECLMETHOD_LOOKUPPRESAMPLED或D3DDECLMETHOD_LOOKUP的顶点元素。
  • 声明应只有一个具有 D3DDECLMETHOD_LOOKUP 或 D3DDECLMETHOD_LOOKUPPRESAMPLED 方法的元素。
  • 使用 D3DDECLMETHOD_LOOKUP 或 D3DDECLMETHOD_LOOKUPPRESAMPLED 的声明不应具有除D3DDECLMETHOD_DEFAULT以外的元素,因为位移映射仅对 N 补丁执行。
  • 具有D3DDECLMETHOD_LOOKUP或D3DDECLMETHOD_LOOKUPPRESAMPLED的顶点元素只能与 (D3DDECLUSAGE_SAMPLE一起使用,n) 语义,反之亦然。
  • 如果具有 D3DDECLMETHOD_LOOKUP 方法的顶点元素具有现有顶点元素的流索引和偏移量,则此顶点元素应具有相同的数据类型。
  • 具有 D3DDECLMETHOD_LOOKUP 方法的顶点元素应具有 D3DDECLTYPE_FLOAT2/3/4 数据类型
  • 类型D3DDECLMETHOD_CROSSUV、D3DDECLMETHOD_PARTIALU和D3DDECLMETHOD_PARTIALV的顶点元素应具有兼容数据类型的顶点元素的偏移量。
  • 方法D3DDECLMETHOD_UV或D3DDECLMETHOD_LOOKUPPRESAMPLED的顶点元素必须具有类型D3DDECLTYPE_UNUSED、流索引零和流偏移零。
  • 具有方法D3DDECLMETHOD_UV、D3DDECLMETHOD_PARTIALU和D3DDECLMETHOD_PARTIALV的声明只能与 DrawRectPatch 一起使用。
  • 用法D3DDECLUSAGE_TESSFACTOR只能与数据类型D3DDECLTYPE_FLOAT1和使用情况索引 0 一起使用。
  • 当声明用于细化 (DrawRectPatch、DrawTriPatch、N 补丁) 时,数据类型必须小于或等于D3DDECLTYPE_SHORT4。
  • 仅当设备支持时,才能创建包含需要某些设备功能的方法的声明, (例如位移映射、RT 补丁) 。
  • 用于绘制点和线条的顶点声明不能具有除D3DDECLMETHOD_DEFAULT以外的方法。
  • 可以创建的声明还取决于驱动程序功能。

驱动程序注意事项

Pre-Direct3D 9 驱动程序

  • 输入声明必须可转换为有效的 FVF (顶点元素的顺序相同,其数据类型) 。
  • 不允许纹理坐标中的间隙。 这意味着,如果有具有 (D3DDECLUSAGE_TEXCOORD、n) 的顶点元素,则还应存在具有 (D3DDECLUSAGE_TEXCOORD、n-1) 的顶点元素。

不支持像素着色器版本 3 的 Direct3D 9 驱动程序

  • 输入声明必须可转换为有效的 FVF (顶点元素的顺序相同,其数据类型) 。
  • 允许纹理坐标中的间隙。

支持像素着色器版本 3 的 Direct3D 9 驱动程序

允许使用更常规的声明。

  • 顶点元素可以按任意顺序排列,并且可以具有任何数据类型。
  • 如果设备设置D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET,多个顶点元素可以共享相同的流偏移量,并且在同一时间属于不同的类型。

可编程顶点管道的顶点声明用法

  • 在绘制时,Direct3D 在当前顶点声明和当前顶点着色器函数中查找相同的“usage - usage index”组合。 找到组合后,着色器函数 DCL 中的寄存器将用作顶点元素的目标。
  • 当当前顶点声明中的顶点元素具有在当前顶点着色器中找不到的用法时,将忽略该顶点元素。
  • 使用低于 2.0 的顶点着色器版本时,着色器代码中提到的所有语义都需要在绘制时绑定的声明中存在。 使用顶点着色器 2.0 及更高版本时,不存在允许应用程序对同一顶点着色器使用不同的顶点声明的限制。 当顶点着色器基于静态条件读取输入数据时,这非常有用。 因此未初始化的顶点着色器寄存器将具有未定义的值。

在 DirectX 8 驱动程序上将 与硬件顶点处理配合使用时,还有其他限制:

  • 顶点元素不能重叠或共享相同的偏移量。
  • 数据类型仅限于 DirectX 8 驱动程序可以理解的内容。

如果提供的声明无法转换为 DirectX 8 样式声明,CreateVertexDeclaration 可能会失败。 对于混合模式设备,此故障将在 Draw* 时间发生,因为只有这样才能知道此着色器是用于硬件还是软件顶点处理。

固定函数管道的顶点声明用法

只能使用符合以下规则的声明:

  • 在 DirectX 8 声明中不允许使用 SKIP 的顶点元素之间不应有间隙 (,该声明用于固定函数管道) 。
  • 必须指定语义 (D3DDECLUSAGE_POSITION 0) ,并且应具有D3DDECLTYPE_FLOAT3数据类型。
  • 具有方法D3DDECLMETHOD_UV的顶点元素必须指定用法D3DDECLUSAGE_TEXCOORD或D3DDECLUSAGE_BLENDWEIGHT。
  • 具有方法D3DDECLMETHOD_PARTIALU、_PARTIALV或_CROSSUV的顶点元素只能与D3DDECLUSAGE_POSITION、_NORMAL、_BLENDWEIGHT或_TEXCOORD一起使用,并且必须使用输入类型D3DDECLTYPE_FLOAT3。

当声明与 DirectX 8 驱动程序上的硬件顶点处理一起使用时,Direct3D 运行时会使用以下规则将其转换为 DirectX 8 样式声明:

  • 顶点元素不能在流中共享相同的偏移量,并且它们不能重叠。
  • 数据类型必须小于或等于D3DDECLTYPE_SHORT4。
  • 仅允许以下方法:D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_CROSSUV和D3DDECLMETHOD_UV
  • Direct3D 9 声明与 Direct3D 8 声明 (Direct3D 9) 之间的映射 显示哪些 Direct3D 9 语义可以转换为 DirectX 8 样式声明。 Usage 和 UsageIndex 将转换为寄存器值。
  • 如果声明中有 n 个顶点元素,并且 0 - m (m < n) 映射到 Direct3D 声明与 FVF 代码 (Direct3D 9) ) (FVF 代码之间的映射中所述的 FVF ( 元素,但 m + 1 没有,则:
    • 如果 m + 2 到 n - 1 个顶点元素中的任何一个映射到 FVF/dx8decl,则声明无效。
    • 0 到 m 的元素由 DirectX 8 和更早版本的驱动程序的运行时 (转换, 由 Direct3D 9 驱动程序) 使用 Direct3D 声明和 FVF 代码之间的映射 (Direct3D 9) ,m + 1,m + 2 直到 n - 1 映射到连续 texcoord (k) ,texcoord (k+1) , 从元素 0 - m 中的任何 texcoord 开始。
    • 映射的 texcoord 处的数据类型假定为 float[1234],替换当前元素包含的任何数据类型 (但大小) 相同。 因此,现有数据类型可以是 Direct3D 声明与 FVF 代码之间的映射中不 (Direct3D 9)
    • 如果 k 达到 8,则 FVF/dx8decl 的声明无效。
    • 如果发生到 texcoord 的任何映射,则整个声明不需要具有除 DEFAULT 之外的生成方法的元素,否则声明对 FVF/dx8decl 无效。

将顶点声明与 ProcessVertices 配合使用

顶点声明可用于描述 ProcessVertices 的输出。 此类声明应遵守以下规则:

  • 只能使用流 0。
  • 仅允许D3DDECLMETHOD_DEFAULT方法。
  • 只能使用D3DDECLTYPE_FLOATn或D3DDECLTYPE_D3DCOLOR数据类型。
  • 顶点元素不能共享相同的偏移量或相互重叠。
  • 不需要具有 (D3DDECLUSAGE_POSITION、0) 或 (D3DDECLUSAGE_POSITIONT,0) 的顶点元素。
  • 具有 (D3DDECLUSAGE_POSITION、0) 和 (D3DDECLUSAGE_POSITIONT,0) 的顶点元素不能存在于同一声明中。
  • 使用此类声明时,当前顶点着色器的版本必须为 3.0 或更高版本。

顶点声明