Использование индексированного наложения вершин (Direct3D 9)
Состояния преобразования 256–511 зарезервированы для хранения до 256 матриц, которые можно индексировать с помощью 8-разрядных индексов. Используйте макрос D3DTS_WORLDMATRIX для сопоставления индексов от 0 до 255 с соответствующими состояниями преобразования. В следующем примере кода показано, как использовать метод IDirect3Device9::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 содержит индексы 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()
};
Связанные темы