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


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

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