Memperbaiki Kode FVF Fungsi (Direct3D 9)

Kode FVF menjelaskan konten simpul yang disimpan diselingi dalam satu aliran data. Ini umumnya menentukan data yang akan diproses oleh alur pemrosesan vertex fungsi tetap. Ini adalah deklarasi puncak gaya yang lebih lama; untuk melihat gaya deklarasi puncak saat ini, lihat D3DVERTEXELEMENT9.

Aplikasi Direct3D dapat menentukan simpul model dengan beberapa cara yang berbeda. Dukungan untuk definisi verteks yang fleksibel, juga dikenal sebagai format verteks fleksibel atau kode format verteks fleksibel, memungkinkan aplikasi Anda untuk hanya menggunakan komponen puncak yang dibutuhkan, menghilangkan komponen yang tidak digunakan. Dengan hanya menggunakan komponen vertex yang diperlukan, aplikasi Anda dapat menghemat memori dan meminimalkan bandwidth pemrosesan yang diperlukan untuk merender model. Anda menjelaskan bagaimana simpul Anda diformat dengan menggunakan kombinasi kode D3DFVF .

Spesifikasi FVF mencakup format untuk ukuran titik, yang ditentukan oleh D3DFVF_PSIZE. Ukuran ini dinyatakan dalam unit ruang kamera untuk simpul non-transformasi dan menyala (TL), dan dalam unit ruang perangkat untuk simpul TL.

Metode penyajian antarmuka IDirect3DDevice9 menyediakan aplikasi C++ dengan metode yang menerima kombinasi bendera ini, dan menggunakannya untuk menentukan cara merender primitif. Pada dasarnya, bendera ini memberi tahu sistem komponen vertex mana - posisi, bobot campuran vertex, normal, warna, dan jumlah dan format koordinat tekstur - aplikasi Anda menggunakan dan, secara tidak langsung, bagian mana dari alur penyajian yang Anda inginkan untuk diterapkan Direct3D kepada mereka. Selain itu, ada atau tidak adanya bendera format vertex tertentu berkomunikasi ke sistem tempat bidang komponen vertex ada dalam memori dan yang telah Anda hilangkan.

Untuk menentukan batasan perangkat, Anda dapat mengkueri perangkat untuk nilai D3DFVFCAPS_DONOTSTRIPELEMENTS dan D3DFVFCAPS_TEXCOORDCOUNTMASK di anggota FVFCaps D3DCAPS9.

Koordinat tekstur dapat dideklarasikan dalam format yang berbeda, memungkinkan tekstur ditangani menggunakan sesekali satu koordinat atau sebanyak empat koordinat tekstur (untuk koordinat tekstur yang diproyeksikan 2D). Untuk informasi selengkapnya, lihat Format Koordinat Tekstur (Direct3D 9). Gunakan kumpulan makro D3DFVF_TEXCOORDSIZEN untuk membuat pola bit yang mengidentifikasi format koordinat tekstur yang digunakan format puncak Anda.

Tidak ada aplikasi yang akan menggunakan setiap komponen. Bidang reciprocal homogeneous W (RHW) dan vertex normal saling eksklusif. Sebagian besar aplikasi juga tidak akan mencoba menggunakan kedelapan set koordinat tekstur, tetapi Direct3D memiliki kapasitas ini. Ada beberapa batasan bendera mana yang dapat Anda gunakan dengan bendera lain. Misalnya, Anda tidak dapat menggunakan bendera D3DFVF_XYZ dan D3DFVF_XYZRHW bersama-sama, karena ini akan menunjukkan bahwa aplikasi Anda menjelaskan posisi puncak dengan simpul yang tidak ditransformasi dan diubah.

Untuk menggunakan campuran vertex terindeks, bendera D3DFVF_LASTBETA_UBYTE4 akan muncul di akhir deklarasi FVF. Kehadiran bendera ini menunjukkan bahwa bobot campuran kelima akan diperlakukan sebagai DWORD alih-alih float. Untuk informasi selengkapnya, lihat Blending Vertex Terindeks (Direct3D 9).

Sampel kode berikut menunjukkan perbedaan antara kode FVF yang menggunakan bendera D3DFVF_LASTBETA_UBYTE4 dan yang tidak. Bendera D3DFVF_XYZB3 ada ketika empat indeks campuran digunakan karena Anda selalu mengurangi jumlah tiga pertama dari angka satu untuk mendapatkan yang keempat (blend₄ = 1 - (blend₁ + blend₂ + blend₃)).

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

FVF yang ditentukan di bawah ini menggunakan bendera D3DFVF_LAST_UBYTE4.

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

Deklarasi Puncak