Использование индексированного смешивания вершин (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 в каждой вершине. В приведенном ниже примере кода используется метод IDirect3Device9::SetRenderState для включения индексированного смешения вершин.
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
Чтобы включить или отключить слияние вершин, задайте отрисовочное состояние IDirect3DDevice9::SetRenderState на значение, отличное от D3DRS_DISABLE, из перечисляемого типа D3DVERTEXBLENDFLAGS. Если для этого состояния отрисовки не задано значение D3DRS_DISABLE, необходимо передать необходимое количество весов для каждой вершины. В следующем примере кода используется IDirect3DDevice9::SetRenderState для включения смешивания вершин с тремя весами для каждой вершины.
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
Определение поддержки микширования индексированных вершин
Чтобы определить максимальный индекс матрицы смешивания вершин, проверьте элемент MaxVertexBlendMatrixIndex структуры D3DCAPS9. В приведенном ниже примере кода используется метод IDirect3Device9::GetDeviceCaps для получения этого размера.
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
Если значение в MaxVertexBlendMatrixIndex равно 0, устройство не поддерживает индексированные матрицы.
Заметка
При использовании программной обработки вершин можно использовать 256 матриц для индексированного вершинного смешивания с нормалями или без них.
Передача индексов матриц в Direct3D
Индексы матрицы мира можно передавать в Direct3D с помощью устаревших форматов шейдеров вершин — FVF — или деклараций шейдеров.
В приведенном ниже примере кода показано, как использовать устаревшие шейдеры вершин.
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 содержит индекс3, индекс2, индекс1 и индекс0, где индекс0 находится в нижнем байте 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()
};
Связанные разделы