Bagikan melalui


Memetakan Kode FVF ke Deklarasi Direct3D 9 (Direct3D 9)

Tabel ini memetakan kode FVF ke struktur D3DVERTEXELEMENT9 .

FVF Jenis Data Penggunaan Indeks penggunaan
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5 dan D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 dan D3DFVF_LASTBETA_D3DCOLOR D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATn D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT 0
D3DFVF_XYZBn (n=1..4) dan D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) dan D3DFVF_LASTBETA_D3DCOLOR D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_NORMAL D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 0
D3DFVF_PSIZE D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_PSIZE 0
D3DFVF_DIFFUSE D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 0
D3DFVF_SPECULAR D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 1
D3DFVF_TEXCOORDSIZEm(n) D3DDECLTYPE_FLOATm D3DDECLUSAGE_TEXCOORD n

 

Deklarasi Puncak dengan D3DDECLUSAGE_POSITIONT

Kehadiran elemen vertex dengan (D3DUSAGE_POSITIONT, 0) digunakan untuk menunjukkan kepada perangkat bahwa data puncak yang masuk telah melalui pemrosesan vertex (seperti FVF dengan D3DFVF_XYZRHW bit set). Pada waktu gambar, jika deklarasi yang ditetapkan saat ini memiliki elemen dengan semantik (D3DUSAGE_POSITIONT, 0), seluruh pemrosesan puncak dilewati (sama seperti FVF dengan bit D3DFVF_XYZRHW telah diatur).

Ada beberapa batasan pada deklarasi puncak dengan (D3DDECLUSAGE_POSITIONT, 0):

  • Hanya streaming nol yang dapat digunakan dalam deklarasi tersebut.
  • Elemen Vertex harus diurutkan dengan meningkatkan offset aliran.
  • Offset aliran harus diselaraskan dengan DWORD.
  • Pasangan yang sama (Penggunaan, Indeks Penggunaan) harus dicantumkan hanya sekali.
  • Hanya metode D3DDECLMETHOD_DEFAULT yang dapat digunakan.
  • Elemen vertex lainnya tidak dapat memiliki semantik (D3DDECLUSAGE_POSITION, 0).

Selain itu, ada beberapa batasan pada deklarasi tersebut terkait dengan versi driver perangkat. Pembatasan ini berlaku karena Direct3D mengirimkan deklarasi tersebut langsung ke driver tanpa melakukan konversi apa pun.

Deklarasi Puncak tanpa D3DDECLUSAGE_POSITIONT

Runtime memvalidasi pembuatan deklarasi. Berikut ini adalah aturan umum untuk deklarasi apa yang legal.

  • Semua elemen vertex untuk aliran harus berturut-turut dan diurutkan berdasarkan offset.
  • Offset aliran harus diselaraskan dengan DWORD.
  • Pasangan yang sama (Penggunaan, Indeks Penggunaan) harus dicantumkan hanya sekali.
  • Jika D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET diatur maka
    • Beberapa elemen vertex dapat berbagi offset yang sama dalam aliran.
    • Elemen vertex semuanya dapat dari berbagai jenis yang dapat memiliki ukuran yang berbeda.
    • Elemen vertex dapat tumpang tindih secara arbitrer. Misalnya, satu elemen dapat dimulai di lokasi aliran yaitu, pada saat yang sama, di tengah elemen lain.
    • Elemen Vertex diizinkan untuk memiliki offset aliran dalam urutan apa pun.
  • Jumlah elemen vertex tidak boleh lebih besar dari 64.
  • UsageIndex harus dalam rentang [0-15].
  • Deklarasi, yang digunakan dengan DRAWPrimitive API, tidak boleh memiliki elemen vertex selain D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED, atau D3DDECLMETHOD_LOOKUP.
  • Deklarasi, yang berisi D3DDECLMETHOD_LOOKUP atau LOOKUPPRESAMPLED, harus digunakan hanya dengan alur vertex yang dapat diprogram.
  • Deklarasi, yang digunakan dengan DRAWRectPatch/DrawTriPatch API, tidak dapat memiliki elemen vertex dengan D3DDECLMETHOD_LOOKUPPRESAMPLED atau D3DDECLMETHOD_LOOKUP.
  • Deklarasi seharusnya hanya memiliki satu elemen dengan metode D3DDECLMETHOD_LOOKUP atau D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • Deklarasi dengan D3DDECLMETHOD_LOOKUP atau D3DDECLMETHOD_LOOKUPPRESAMPLED tidak boleh memiliki elemen selain D3DDECLMETHOD_DEFAULT, karena pemetaan perpindahan dilakukan hanya untuk N-patch.
  • Elemen Vertex dengan D3DDECLMETHOD_LOOKUP atau D3DDECLMETHOD_LOOKUPPRESAMPLED hanya dapat digunakan dengan semantik (D3DDECLUSAGE_SAMPLE, n) dan sebaliknya.
  • Jika elemen vertex dengan metode D3DDECLMETHOD_LOOKUP memiliki indeks aliran dan offset elemen vertex yang sudah ada, elemen vertex ini harus memiliki jenis data yang sama.
  • Elemen vertex dengan metode D3DDECLMETHOD_LOOKUP harus memiliki jenis data D3DDECLTYPE_FLOAT2/3/4
  • Elemen Vertex dengan jenis D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU, dan D3DDECLMETHOD_PARTIALV harus memiliki offset elemen vertex dengan jenis data yang kompatibel.
  • Elemen vertex dengan metode D3DDECLMETHOD_UV atau D3DDECLMETHOD_LOOKUPPRESAMPLED harus memiliki jenis D3DDECLTYPE_UNUSED, streaming indeks nol, dan aliran offset nol.
  • Deklarasi dengan metode D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU, dan D3DDECLMETHOD_PARTIALV hanya dapat digunakan dengan DrawRectPatch.
  • D3DDECLUSAGE_TESSFACTOR penggunaan hanya boleh digunakan dengan jenis data D3DDECLTYPE_FLOAT1 dan indeks penggunaan 0.
  • Saat deklarasi digunakan untuk tessellation (DrawRectPatch, DrawTriPatch, N-patchs), jenis data harus kurang dari atau sama dengan D3DDECLTYPE_SHORT4.
  • Deklarasi yang berisi metode yang memerlukan kemampuan perangkat tertentu (misalnya, pemetaan perpindahan, patch RT) hanya dapat dibuat jika perangkat mendukungnya.
  • Deklarasi puncak yang digunakan untuk menggambar titik dan garis tidak dapat memiliki metode selain D3DDECLMETHOD_DEFAULT.
  • Deklarasi yang dapat dibuat juga tergantung pada kemampuan driver.

Pertimbangan Driver

Driver Pra-Direct3D 9

  • Deklarasi input harus dapat diterjemahkan ke FVF yang valid (memiliki urutan elemen vertex yang sama dan jenis datanya).
  • Celah dalam koordinat tekstur tidak diperbolehkan. Ini berarti bahwa jika ada elemen puncak dengan (D3DDECLUSAGE_TEXCOORD, n) maka juga harus ada elemen vertex dengan (D3DDECLUSAGE_TEXCOORD, n-1).

Driver Direct3D 9 tanpa Dukungan Pixel Shader Versi 3

  • Deklarasi input harus dapat diterjemahkan ke FVF yang valid (memiliki urutan elemen vertex yang sama dan jenis datanya).
  • Celah dalam koordinat tekstur diperbolehkan.

Driver Direct3D 9 dengan Dukungan Pixel Shader Versi 3

Deklarasi yang lebih umum diizinkan.

  • Elemen Vertex dapat dalam urutan arbitrer dan dapat memiliki jenis data apa pun.
  • Beberapa elemen vertex dapat berbagi offset aliran yang sama dan memiliki jenis yang berbeda dalam waktu yang sama jika D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET diatur oleh perangkat.

Penggunaan Deklarasi Vertex dengan Alur Verteks yang Dapat Diprogram

  • Pada waktu gambar, Direct3D mencari kombinasi "penggunaan - indeks penggunaan" yang sama dalam deklarasi puncak saat ini dan fungsi shader vertex saat ini. Ketika kombinasi ditemukan, register dari fungsi shader DCL digunakan sebagai tujuan untuk elemen vertex.
  • Ketika elemen vertex dalam deklarasi puncak saat ini memiliki penggunaan yang tidak ditemukan di shader vertex saat ini, elemen vertex tersebut diabaikan.
  • Saat menggunakan shader vertex versi kurang dari 2.0, semua semantik yang disebutkan dalam kode shader perlu ada dalam deklarasi yang terikat pada waktu gambar. Saat menggunakan shader vertex 2.0 ke atas, pembatasan ini yang memungkinkan aplikasi untuk menggunakan deklarasi vertex yang berbeda dengan shader vertex yang sama tidak ada. Ini berguna ketika shader vertex membaca data input berdasarkan kondisi statis. Daftar shader vertex tidak diinisialisasi karena ini akan memiliki nilai yang tidak terdefinisi.

Ada batasan tambahan saat menggunakan dengan pemrosesan puncak perangkat keras pada driver DirectX 8:

  • Elemen Vertex tidak dapat tumpang tindih atau berbagi offset yang sama.
  • Jenis data terbatas pada apa yang dapat dipahami driver DirectX 8.

CreateVertexDeclaration mungkin gagal jika deklarasi yang diberikan tidak dapat dikonversi ke deklarasi gaya DirectX 8. Untuk perangkat mode campuran, kegagalan ini akan terjadi pada waktu Draw* karena itulah satu-satunya waktu yang dapat diketahui apakah shader ini digunakan dengan pemrosesan verteks perangkat keras atau perangkat lunak.

Penggunaan Deklarasi Puncak dengan Alur Fungsi Tetap

Hanya deklarasi yang mematuhi aturan berikut yang dapat digunakan:

  • Seharusnya tidak ada celah antara elemen vertex (SKIP tidak diizinkan dalam deklarasi DirectX 8, yang digunakan untuk alur fungsi tetap).
  • Semantik (D3DDECLUSAGE_POSITION, 0) harus ditentukan dan harus memiliki jenis data D3DDECLTYPE_FLOAT3.
  • Elemen vertex dengan metode D3DDECLMETHOD_UV harus menentukan D3DDECLUSAGE_TEXCOORD penggunaan atau D3DDECLUSAGE_BLENDWEIGHT.
  • Elemen puncak dengan metode D3DDECLMETHOD_PARTIALU, _PARTIALV, atau _CROSSUV hanya dapat digunakan dengan D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT, atau _TEXCOORD, dan harus menggunakan jenis input D3DDECLTYPE_FLOAT3.

Ketika deklarasi digunakan dengan pemrosesan puncak perangkat keras pada driver DirectX 8, runtime Direct3D mengonversinya menjadi deklarasi gaya DirectX 8 dengan aturan berikut:

  • Elemen Vertex tidak dapat berbagi offset yang sama dalam aliran dan tidak dapat tumpang tindih.
  • Jenis data harus kurang atau sama dengan D3DDECLTYPE_SHORT4.
  • Hanya metode berikut yang diizinkan: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV, dan D3DDECLMETHOD_UV
  • Pemetaan antara Deklarasi Direct3D 9 dan Deklarasi Direct3D 8 (Direct3D 9) menunjukkan semantik Direct3D 9 mana yang dapat dikonversi ke deklarasi gaya DirectX 8. Penggunaan dan UsageIndex dikonversi ke nilai register.
  • Jika ada elemen n vertex dalam deklarasi dan peta 0 - m (m < n) ke FVF (elemen yang dijelaskan dalam Pemetaan antara Deklarasi Direct3D dan Kode FVF (Direct3D 9)), tetapi m + 1 tidak, maka:
    • Jika salah satu dari m + 2 hingga n - 1 elemen vertex memetakan ke FVF/dx8decl, deklarasi tidak valid.
    • Elemen 0 hingga m dikonversi (oleh runtime untuk DirectX 8 dan driver yang lebih lama, dan oleh driver Direct3D 9) menggunakan Pemetaan antara Deklarasi Direct3D dan Kode FVF (Direct3D 9), m + 1, m + 2 hingga n - 1 dipetakan ke texcoord(k) yang berdekatan, texcoord(k+1), mulai dari texcoord apa pun dalam elemen 0 - m.
    • Jenis data pada texcoord yang dipetakan diasumsikan sebagai float[1234] menggantikan jenis data apa pun yang dikandung elemen saat ini (tetapi ukurannya sama). Oleh karena itu, jenis data yang ada bisa menjadi sesuatu yang tidak ada dalam Pemetaan antara Deklarasi Direct3D dan Kode FVF (Direct3D 9).
    • Jika k mencapai 8, deklarasi tidak valid untuk FVF/dx8decl.
    • Jika ada pemetaan ke texcoord yang terjadi, seluruh deklarasi diperlukan untuk tidak memiliki elemen dengan metode pembuatan selain DEFAULT atau deklarasi tidak valid untuk FVF/dx8decl.

Menggunakan Deklarasi Vertex dengan ProcessVertices

Deklarasi puncak dapat digunakan untuk menggambarkan output ProcessVertices. Deklarasi tersebut harus mematuhi aturan berikut:

  • Hanya aliran 0 yang harus digunakan.
  • Hanya metode D3DDECLMETHOD_DEFAULT yang diizinkan.
  • Hanya jenis data D3DDECLTYPE_FLOATn atau D3DDECLTYPE_D3DCOLOR yang dapat digunakan.
  • Elemen Vertex tidak dapat berbagi offset atau tumpang tindih yang sama satu sama lain.
  • Elemen vertex dengan (D3DDECLUSAGE_POSITION, 0) atau (D3DDECLUSAGE_POSITIONT,0) tidak diperlukan.
  • Elemen vertex dengan (D3DDECLUSAGE_POSITION, 0) dan (D3DDECLUSAGE_POSITIONT,0) tidak dapat hadir dalam deklarasi yang sama.
  • Shader vertex saat ini harus versi 3.0 atau lebih tinggi ketika deklarasi tersebut digunakan.

Deklarasi Puncak