Blending Geometri (Direct3D 9)

Direct3D memungkinkan aplikasi untuk meningkatkan realisme adegannya dengan merender objek poligonal tersegmentasi - terutama karakter - yang memiliki sambungan campuran dengan lancar. Efek ini sering disebut sebagai skinning. Sistem mencapai efek ini dengan menerapkan matriks transformasi dunia tambahan ke satu set simpul untuk membuat beberapa hasil, lalu melakukan perpaduan linier antara simpul yang dihasilkan untuk membuat satu set geometri untuk penyajian. Ilustrasi pisang berikut menunjukkan proses ini.

ilustrasi proses untuk memadukan dua objek dengan tekstur pisang

Ilustrasi sebelumnya menunjukkan bagaimana Anda dapat membayangkan proses geometry-blending. Dalam satu panggilan penyajian, sistem mengambil simpul untuk pisang, mengubahnya dua kali - sekali tanpa modifikasi, dan sekali dengan rotasi sederhana - dan memadukan hasilnya untuk membuat pisang membungkuk. Sistem memadukan posisi puncak, serta puncak normal saat pencahayaan diaktifkan. Aplikasi tidak terbatas pada dua jalur penpaduan; Direct3D dapat memadukan geometri antara sebanyak empat matriks dunia, termasuk matriks dunia standar, D3DTS_WORLD.

Catatan

Saat pencahayaan diaktifkan, vertex normal diubah oleh matriks tampilan dunia terbalik yang sesuai, ditimbang dengan cara yang sama seperti komputasi posisi puncak. Sistem menormalkan vektor normal yang dihasilkan jika status render D3DRS_NORMALIZENORMALS diatur ke TRUE.

 

Tanpa perpaduan geometri, model artikulasi dinamis sering dirender dalam segmen. Misalnya, pertimbangkan model 3D lengan manusia. Dalam tampilan paling sederhana, lengan memiliki dua bagian: lengan atas yang terhubung ke tubuh, dan lengan bawah, yang terhubung ke tangan. Keduanya terhubung pada siku, dan lengan bawah berputar pada saat itu. Aplikasi yang merender lengan mungkin menyimpan data vertex untuk lengan atas dan bawah, masing-masing dengan matriks transformasi dunia yang terpisah. Contoh kode berikut menggambarkan hal ini.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

Untuk merender lengan, dua panggilan penyajian dilakukan, seperti yang ditunjukkan dalam kode berikut.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

Ilustrasi berikut adalah pisang, dimodifikasi untuk menggunakan teknik ini.

ilustrasi pisang campuran tanpa perpaduan geometri

Perbedaan antara geometri campuran dan geometri yang tidak terbendung jelas. Contoh ini agak ekstrem. Dalam aplikasi dunia nyata, sendi model tersegmentasi dirancang sehingga jahitan tidak sejelas. Namun, jahitan kadang-kadang terlihat, yang menghadirkan tantangan konstan bagi desainer model.

Perpaduan geometri di Direct3D menyajikan alternatif untuk skenario pemodelan tersegmentasi klasik. Namun, peningkatan kualitas visual objek tersegmentasi datang dengan biaya komputasi campuran selama penyajian. Untuk meminimalkan dampak operasi tambahan ini, alur geometri Direct3D dioptimalkan untuk memadukan geometri dengan overhead sekecil mungkin. Aplikasi yang secara cerdas menggunakan layanan blending geometri yang ditawarkan oleh Direct3D dapat meningkatkan realisme karakter mereka sambil menghindari dampak performa yang serius.

Memadukan Status Transformasi dan Render

Metode IDirect3DDevice9::SetTransform mengenali makro D3DTS_WORLD dan D3DTS_WORLDn , yang sesuai dengan nilai yang dapat ditentukan oleh makro D3DTS_WORLDMATRIX . Makro ini digunakan untuk mengidentifikasi matriks di antara geometri mana yang akan dicambuk.

Jenis yang dijumlahkan D3DRENDERSTATETYPE mencakup status render D3DRS_VERTEXBLEND untuk mengaktifkan dan mengontrol perpaduan geometri. Nilai yang valid untuk status render ini ditentukan oleh jenis enumerasi D3DVERTEXBLENDFLAGS . Jika penpaduan geometri diaktifkan, format vertex harus menyertakan jumlah bobot blending yang sesuai.

Bobot Blending

Berat campuran, kadang-kadang disebut beta weight, mengontrol sejauh mana matriks dunia tertentu mempengaruhi puncak. Bobot blending adalah nilai floating-point yang berkisar antara 0,0 hingga 1,0, dikodekan dalam format puncak, di mana nilai 0,0 berarti puncak tidak dipadukan dengan matriks tersebut, dan 1,0 berarti bahwa puncak dipengaruhi secara penuh oleh matriks.

Bobot penpaduan geometri dikodekan dalam format puncak, muncul segera setelah posisi untuk setiap puncak, seperti yang dijelaskan dalam Kode FVF Fungsi Tetap (Direct3D 9). Anda mengomunikasikan jumlah bobot campuran dalam format vertex dengan menyertakan salah satu konstanta FVF dalam deskripsi puncak yang Anda berikan ke metode penyajian.

Sistem melakukan perpaduan linier antara hasil tertimbang matriks campuran. Persamaan berikut adalah rumus penpaduan lengkap.

persamaan campuran linier, menggunakan matriks transformasi dunia

Dalam persamaan sebelumnya, vBlend adalah puncak output, elemen v adalah simpul yang dihasilkan oleh matriks dunia yang diterapkan (D3DTS_WORLDn). Elemen W adalah nilai bobot yang sesuai dalam format puncak. Vertex yang dipadukan antara n matriks dapat memiliki - 1 nilai berat campuran, satu untuk setiap matriks campuran, kecuali yang terakhir. Sistem secara otomatis menghasilkan berat untuk matriks dunia terakhir sehingga jumlah semua bobot adalah 1,0, yang dinyatakan dalam notasi sigma di sini. Rumus ini dapat disederhanakan untuk setiap kasus yang didukung oleh Direct3D, yang diperlihatkan dalam persamaan berikut.

persamaan penpaduan linier untuk tiga kasus penpaduan

Ini adalah bentuk yang disederhanakan dari rumus campuran lengkap untuk dua, tiga, dan empat kasus matriks campuran.

Catatan

Meskipun Direct3D menyertakan deskriptor FVF untuk menentukan simpul yang berisi hingga lima bobot campuran, hanya tiga yang dapat digunakan dalam rilis DirectX ini.

 

Informasi tambahan terkandung dalam topik berikut.

Alur Vertex