Bagikan melalui


Tessellation (Direct3D 9)

Unit Tesselator

Unit tesselator telah ditingkatkan. Anda sekarang dapat menggunakannya untuk:

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

Di 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

Tesselulasi adaptif dapat diterapkan pada primitif berurutan tinggi termasuk N-patch, 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.

Z-coordinates (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 tesselulasi 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 tesselulasi kemudian dijepit ke nilai, yang ditentukan oleh dua status render tambahan D3DRS_MINTESSELLATIONLEVEL dan D3DRS_MAXTESSELLATIONLEVEL, yang menentukan tingkat tesselerasi 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 komputasi 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], simpul (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 dasar Bezier, simpul kontrol sudut digunakan.

Kontrol laju tesselasi per vertex. Aplikasi dapat secara opsional menyediakan satu nilai floating-point positif per puncak, yang dapat digunakan untuk mengontrol laju 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 tesselulasi (Te) untuk tepi e, yang 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