Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
Topik terkait