Поделиться через


Использование индексированного смешивания вершин (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()
};

индексированное вершинное смешивание