Bagikan melalui


Tessellation (Direct3D 9)

Tessellator Unit

Unit tesselator telah ditingkatkan. Anda sekarang dapat menggunakannya untuk:

  • Lakukan tessellasi adaptif dari semua primitif urutan yang lebih tinggi.
  • Cari nilai perpindahan per verteks dari peta perpindahan dan teruskan ke shader vertex.
  • Mendukung tesselulasi persegi panjang-patch. Ini ditentukan melalui deklarasi puncak menggunakan D3DDECLMETHOD_PARTIALU atau D3DDECLMETHOD_PARTIALV. Jika deklarasi puncak yang berisi metode ini digunakan untuk menggambar patch segitiga, IDirect3DDevice9::D rawTriPatch akan gagal. Untuk informasi selengkapnya tentang deklarasi puncak, lihat D3DVERTEXELEMENT9.

Dalam DirectX 8.x, apa yang disebut ORDER benar-benar gelar. Dalam Direct3D 9, derajat sekarang ditentukan oleh D3DDEGREETYPE.

 // This used to be D3DORDERTYPE and D3DORDER* 
 typedef enum _D3DDEGREETYPE 
 { 
 D3DDEGREE_LINEAR = 1, 
 D3DDEGREE_QUADRATIC = 2, 
 D3DDEGREE_CUBIC = 3, 
 D3DDEGREE_QUINTIC = 5, 
 D3DDEGREE_FORCE_DWORD = 0x7fffffff, 
 } D3DDEGREETYPE; 

Perubahan jenis derajat mempengaruhi dua struktur lainnya.

typedef struct _D3DRECTPATCH_INFO 
 { 
 UINT StartVertexOffsetWidth; 
 UINT StartVertexOffsetHeight; 
 UINT Width; 
 UINT Height; 
 UINT Stride; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DRECTPATCH_INFO; 
 typedef struct _D3DTRIPATCH_INFO 
 { 
 UINT StartVertexOffset; 
 UINT NumVertices; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DTRIPATCH_INFO; 

Driver perlu memperbaiki kesalahan kompilasi yang akan dihasilkan dari perubahan ini ketika mereka mengkompilasi dengan header baru. Tidak ada fungsionalitas yang harus diubah.

Tessellation Adaptif

Tesselasi adaptif dapat diterapkan pada primitif urutan tinggi termasuk patch N, patch persegi panjang, dan patch segitiga. Fitur ini diaktifkan oleh D3DRS_ENABLEADAPTIVETESSELLATION dan secara adaptif tessellates patch, berdasarkan nilai kedalaman verteks kontrol di ruang mata.

Koordinat z (Zi) simpul kontrol (Vi), yang diubah menjadi ruang mata (Zieye) dengan melakukan produk titik dengan 4 vektor, digunakan sebagai nilai kedalaman. Vektor 4D (Mdm) ditentukan oleh aplikasi menggunakan empat status render (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z, dan D3DRS_ADAPTIVETESS_W). 4-vektor ini bisa menjadi kolom ketiga dari dunia yang digabungkan dan melihat matriks. Ini juga dapat digunakan untuk menerapkan skala ke Zieye.

Fungsi untuk menghitung tingkat tessellation Ti dari Zieye diasumsikan (MaxTessellationLevel/Zieye), yang berarti bahwa MaxTessellationLevel adalah tingkat tessellation di Z = 1 di ruang mata. MaxTessellationLevel sama dengan nilai yang ditetapkan oleh IDirect3DDevice9::SetNPatchMode untuk N-patch dan, untuk patch RT, sama dengan pNumSegs. Tingkat tessellation kemudian dijepit ke nilai, yang ditentukan oleh dua status render tambahan D3DRS_MINTESSELLATIONLEVEL dan D3DRS_MAXTESSELLATIONLEVEL, yang menentukan tingkat tessellation minimum dan maksimum yang akan dijepit. Ti untuk setiap puncak di sepanjang tepi patch rata-rata untuk mendapatkan tingkat tessellation untuk tepi tersebut. Algoritma untuk menghitung Ti untuk patch persegi panjang, patch segitiga, dan N-patch berbeda dalam simpul kontrol apa yang digunakan untuk menghitung tingkat tessellation.

Untuk patch persegi panjang dengan dasar B-spline, empat simpul kontrol terluar digunakan. Misalnya, dengan urutan D3DORDER_CUBIC: simpul (1,1) dan (1,lebar-2) digunakan dengan pNumSegs[0], simpul (1,lebar-2) dan (tinggi-2,tinggi-2) digunakan dengan pNumSegs[1], puncak (tinggi-2,lebar-2) dan (1,lebar-2) digunakan dengan pNumSegs[2], dan simpul (2,1) dan (1,1) digunakan dengan pNumSegs[3].

Untuk patch segitiga, simpul patch sudut digunakan. Dengan urutan D3DORDER_CUBIC: simpul (0) dan (9) digunakan dengan pNumSegs[0], simpul (9) dan (6) digunakan dengan pNumSegs[1] dan simpul (6) dan (0) digunakan dengan pNumSegs[3].

Untuk N-patch, simpul segitiga digunakan.

Untuk patch persegi panjang dan segitiga dengan basis Bezier, simpul kontrol sudut digunakan.

Kontrol laju tessellation per-vertex. Aplikasi dapat secara opsional menyediakan satu nilai titik floating positif per puncak, yang dapat digunakan untuk mengontrol tingkat tessellation. Ini disediakan menggunakan D3DDECLUSAGE_TESSFACTOR, yang indeks penggunaannya harus 0 dan jenis input harus D3DDECLTYPE_FLOAT1. Ini dikalikan ke tingkat tesselulasi per vertex.

Matematika

Tingkat tessellation (Te) untuk tepi e, diwakili oleh dua simpul kontrol (Ve1, Ve2), dihitung seperti yang ditunjukkan di bawah ini:

Vertex Vi: (Xi, Yi, Zi, TFactori (optional)). 
Ze1eye = Ve1 . Mdm 
Ze2eye = Ve2 . Mdm 
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye 
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye 
Te = ( Te1 + Te2 ) / 2; 
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL 
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL 

Ketika D3DRS_ENABLEADAPTIVETESSELLATION TRUE, primitif segitiga (daftar segitiga, kipas, strip) digambar sebagai N-patch, IDirect3DDevice9::SetNPatchMode telah menetapkan nilai kurang dari 1,0.

Perubahan API

Status render baru:

 D3DRS_ENABLEADAPTIVETESSELLATION // BOOL 
 D3DRS_MAXTESSELLATIONLEVEL       // Float 
 D3DRS_MINTESSELLATIONLEVEL       // Float 
 D3DRS_ADAPTIVETESS_X             // Float 
 D3DRS_ADAPTIVETESS_Y             // Float 
 D3DRS_ADAPTIVETESS_Z             // Float 
 D3DRS_ADAPTIVETESS_W             // Float 
 
 // D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL 
 // cannot be less than 1 

Dan nilai defaultnya:

D3DRS_MAXTESSELLATIONLEVEL = 1.0f 
D3DRS_MINTESSELLATIONLEVEL = 1.0f 
D3DRS_ADAPTIVETESS_X = 0.0f 
D3DRS_ADAPTIVETESS_Y = 0.0f 
D3DRS_ADAPTIVETESS_Z = 1.0f 
D3DRS_ADAPTIVETESS_W = 0.0f 
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE 

Batas perangkat keras baru:

D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches 
D3DDEVCAPS2_ADAPTIVETESSNPATCH  // Can adaptively tessellate N-patches 

Alur Vertex