Bagikan melalui


Menggunakan Blending Vertex Terindeks (Direct3D 9)

Status transformasi 256-511 dicadangkan untuk menyimpan hingga 256 matriks yang dapat diindeks menggunakan indeks 8-bit. Gunakan D3DTS_WORLDMATRIX makro untuk memetakan indeks 0-255 ke status transformasi terkait. Contoh kode berikut menunjukkan cara menggunakan metode IDirect3DDevice9::SetTransform untuk mengatur matriks pada nomor status transformasi 256 ke matriks identitas.

D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );

Untuk mengaktifkan atau menonaktifkan penpaduan puncak terindeks, atur status render D3DRS_INDEXEDVERTEXBLENDENABLE ke TRUE. Ketika status render diaktifkan, Anda harus meneruskan indeks matriks sebagai DWORD yang dikemas dengan setiap puncak. Ketika status render ini dinonaktifkan dan penpaduan puncak diaktifkan, setara dengan indeks matriks 0, 1, 2, dan 3 di setiap puncak. Contoh kode di bawah ini menggunakan metode IDirect3DDevice9::SetRenderState untuk mengaktifkan penpaduan vertex terindeks.

m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );

Untuk mengaktifkan atau menonaktifkan penpaduan vertex, atur status render IDirect3DDevice9::SetRenderState ke nilai selain D3DRS_DISABLE dari jenis enumerasi D3DVERTEXBLENDFLAGS . Jika status render ini tidak diatur ke D3DRS_DISABLE, maka Anda harus meneruskan jumlah bobot yang diperlukan untuk setiap puncak. Contoh kode berikut menggunakan IDirect3DDevice9::SetRenderState untuk mengaktifkan penpaduan vertex dengan tiga bobot untuk setiap vertex.

m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );

Menentukan Dukungan Blending Vertex Terindeks

Untuk menentukan ukuran maksimum untuk matriks penpaduan puncak terindeks, periksa anggota MaxVertexBlendMatrixIndex struktur D3DCAPS9 . Contoh kode di bawah ini menggunakan metode IDirect3DDevice9::GetDeviceCaps untuk mengambil ukuran ini.

D3DCAPS9 d3dCaps;
    
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;

Jika nilai yang ditetapkan dalam MaxVertexBlendMatrixIndex adalah 0, perangkat tidak mendukung matriks terindeks.

Catatan

Ketika pemrosesan vertex perangkat lunak digunakan, 256 matriks dapat digunakan untuk pencamburan vertex terindeks, dengan atau tanpa pencamuran normal.

 

Meneruskan Indeks Matriks ke Direct3D

Indeks matriks dunia dapat diteruskan ke Direct3D dengan menggunakan shader vertex warisan - FVF - atau deklarasi.

Contoh kode di bawah ini menunjukkan cara menggunakan shader vertex warisan.

struct VERTEX
{
    float x,y,z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
};
    
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
                             D3DFVF_NORMAL);

Saat shader vertex warisan digunakan, indeks matriks diteruskan bersama dengan posisi puncak menggunakan bendera D3DFVF_XYZBn. Indeks matriks diteruskan sebagai byte di dalam DWORD dan harus ada segera setelah berat verteks terakhir. Bobot puncak juga diteruskan menggunakan D3DFVF_XYZBn. DWORD yang dikemas berisi index3, index2, index1, dan index0, di mana index0 terletak di byte terendah DWORD. Jumlah indeks matriks dunia yang digunakan sama dengan angka yang diteruskan ke jumlah matriks yang digunakan untuk pencamburan seperti yang didefinisikan oleh D3DRS_VERTEXBLEND.

Ketika deklarasi digunakan, D3DVSDE_BLENDINDICES menentukan register vertex input untuk mendapatkan indeks matriks. Indeks matriks harus diteruskan sebagai D3DVSDT_UBYTE4.

Contoh kode di bawah ini menunjukkan cara menggunakan deklarasi. Perhatikan bahwa urutan komponen tidak lagi penting kecuali menggunakan shader vertex fungsi tetap.

Berikut adalah deklarasi puncak.

struct VERTEX
{
    float x,y,z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
}

Berikut adalah deklarasi register yang sesuai.

// 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()
};

Blending Vertex Terindeks