Bagikan melalui


Menggunakan Geometry Blending (Direct3D 9)

Struktur yang ditentukan pengguna berikut dapat digunakan untuk simpul yang akan dicambuk antara dua matriks.

// The flexible vertex format (FVF) descriptor for this vertex would be:
//   FVF = D3DFVF_XYZB1 | D3DFVF_NORMAL | D3DFVF_TEX1; 

struct D3DBLENDVERTEX {
    D3DVECTOR v;
    FLOAT     blend; 
    D3DVECTOR n;
    FLOAT     tu, tv;
};

Bobot campuran harus muncul setelah posisi dan data RHW di FVF, dan sebelum puncak normal.

Perhatikan bahwa format vertex sebelumnya hanya berisi satu nilai bobot campuran. Ini karena akan ada dua matriks dunia, yang didefinisikan dalam status transformasi D3DTS_WORLDMATRIX(0) dan D3DTS_WORLDMATRIX(1). Sistem memadukan setiap verteks antara kedua matriks ini menggunakan nilai bobot tunggal. Untuk tiga matriks, hanya diperlukan dua berat, dan sebagainya.

Catatan

Menentukan bobot kulit itu mudah. Menggunakan fungsi linier jarak antara sendi adalah awal yang baik, tetapi fungsi sigmoid yang lebih halus terlihat lebih baik. Memilih fungsi distribusi bobot kulit dapat mengakibatkan lipatan tajam pada sendi, jika diinginkan, dengan menggunakan variasi besar berat kulit dalam jarak pendek.

 

Mengatur Blending Matrices

Anda mengatur matriks transformasi di mana sistem menyatu dengan memanggil metode IDirect3DDevice9::SetTransform . Atur parameter pertama ke nilai yang ditentukan oleh makro D3DTS_WORLDMATRIX , dan atur parameter kedua ke alamat matriks yang akan diatur.

Contoh kode C++ berikut menetapkan dua matriks dunia, di mana geometri dipadukan untuk membuat ilusi lengan gabungan.

// For this example, the d3dDevice variable is assumed to be a valid pointer
//   to an IDirect3DDevice9 interface for an initialized 3D scene.

float     BendAngle = 3.1415926f / 4.0f; // 45 degrees
D3DMATRIX matUpperArm, matLowerArm;

// The upper arm is immobile. Use the identity matrix.
D3DXMatrixIdentity( matUpperArm );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matUpperArm );

// The lower arm rotates about the x-axis, attached to the upper arm.
D3DXMatrixRotationX( matLowerArm, -BendAngle ); 
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(1), &matLowerArm );

Mengatur matriks campuran hanya menyebabkan sistem menyimpan cache matriks untuk digunakan nanti; itu tidak menginstruksikan sistem untuk mulai memadukan simpul.

Mengaktifkan Blending Geometri

Penpaduan geometri dinonaktifkan secara default. Untuk mengaktifkan perpaduan geometri, panggil metode IDirect3DDevice9::SetRenderState untuk mengatur status render D3DRS_VERTEXBLEND ke nilai dari jenis enumerasi D3DVERTEXBLENDFLAGS . Contoh kode berikut menunjukkan seperti apa panggilan ini saat mengatur status render untuk perpaduan antara dua matriks dunia.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

Ketika D3DRS_VERTEXBLEND diatur ke nilai apa pun selain D3DVBF_DISABLE, sistem mengasumsikan bahwa jumlah bobot campuran yang sesuai akan disertakan dalam format puncak. Anda bertanggung jawab untuk memberikan format puncak yang sesuai, dan untuk memberikan deskripsi yang tepat tentang format tersebut ke metode penyajian Direct3D.

Saat diaktifkan, sistem melakukan perpaduan geometri untuk semua objek yang dirender oleh metode penyajian DrawPrimitive.

Lihat juga

Memperbaiki Kode FVF Fungsi (Direct3D 9)

Blending Geometri