使用索引顶点混合 (Direct3D 9)
保留转换状态 256-511 以存储最多 256 个可以使用 8 位索引编制索引的矩阵。 使用宏 D3DTS_WORLDMATRIX 将索引 0-255 映射到相应的转换状态。 下面的代码示例演示如何使用 IDirect3DDevice9::SetTransform 方法将转换状态号 256 处的矩阵设置为标识矩阵。
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
若要启用或禁用索引顶点混合,请将D3DRS_INDEXEDVERTEXBLENDENABLE呈现状态设置为 TRUE。 启用呈现状态后,必须将矩阵索引作为打包的 DWORD 与每个顶点一起传递。 禁用此呈现状态并启用顶点混合时,它等效于每个顶点的矩阵索引为 0、1、2 和 3。 下面的代码示例使用 IDirect3DDevice9::SetRenderState 方法启用索引顶点混合。
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
若要启用或禁用顶点混合,请将 IDirect3DDevice9::SetRenderState 呈现状态设置为 D3DVERTEXBLENDFLAGS 枚举类型的D3DRS_DISABLE值。 如果此呈现状态未设置为 D3DRS_DISABLE,则必须传递每个顶点所需的权重数。 下面的代码示例使用 IDirect3DDevice9::SetRenderState 为每个顶点启用三个权重的顶点混合。
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
确定索引顶点混合支持
若要确定索引顶点混合矩阵的最大大小,检查 D3DCAPS9 结构的 MaxVertexBlendMatrixIndex 成员。 下面的代码示例使用 IDirect3DDevice9::GetDeviceCaps 方法检索此大小。
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
如果在 MaxVertexBlendMatrixIndex 中设置的值为 0,则设备不支持索引矩阵。
注意
使用软件顶点处理时,可以使用 256 个矩阵进行索引顶点混合,无论是否具有正常混合。
将矩阵索引传递到 Direct3D
可以使用旧版顶点着色器 FVF 或声明将世界矩阵索引传递给 Direct3D。
下面的代码示例演示如何使用旧顶点着色器。
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
D3DFVF_NORMAL);
使用旧顶点着色器时,矩阵索引会使用D3DFVF_XYZBn标志与顶点位置一起传递。 矩阵索引作为字节在 DWORD 内传递,并且必须紧跟在最后一个顶点权重之后。 顶点权重也使用D3DFVF_XYZBn传递。 打包的 DWORD 包含 index3、index2、index1 和 index0,其中 index0 位于 DWORD 的最低字节中。 已用世界矩阵索引数等于传递给 D3DRS_VERTEXBLEND定义的用于混合的矩阵数。
使用声明时,D3DVSDE_BLENDINDICES定义要从中获取矩阵索引的输入顶点寄存器。 矩阵索引必须作为D3DVSDT_UBYTE4传递。
下面的代码示例演示如何使用声明。 请注意,除非使用固定函数顶点着色器,否则组件的顺序不再重要。
下面是顶点声明。
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
}
下面是相应的寄存器声明。
// Create the shader declaration.
D3DVERTEXELEMENT9 decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
{ 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
{ 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
D3DDECL_END()
};
相关主题