Bagikan melalui


Menggunakan Higher-Order Primitif (Direct3D 9)

Bagian ini menunjukkan kepada Anda cara menggunakan primitif dengan urutan yang lebih tinggi dalam aplikasi Anda.

Menentukan Dukungan Primitif Higher-Order

Anggota DevCaps struktur D3DCAPS9 dapat dikueri untuk menentukan tingkat dukungan untuk operasi yang melibatkan primitif urutan yang lebih tinggi. Tabel berikut mencantumkan kemampuan perangkat yang terkait dengan primitif dengan urutan yang lebih tinggi di Direct3D 9.

Kemampuan perangkat Deskripsi
D3DDEVCAPS_NPATCHES Perangkat mendukung N-patch dan didasarkan pada Segitiga PN Melengkung (segitiga Bézier kubik khusus).
D3DDEVCAPS_QUINTICRTPATCHES Perangkat mendukung kurva Bezier quintic dan B-splines.
D3DDEVCAPS_RTPATCHES Perangkat mendukung patch persegi panjang dan segitiga (patch RT).
D3DDEVCAPS_RTPATCHHANDLEZERO Patch RT mungkin digambar secara efisien menggunakan handel nol.

 

Perhatikan bahwa D3DDEVCAPS_RTPATCHHANDLEZERO tidak berarti bahwa patch dengan gagang nol dapat digambar. Patch nol handel selalu dapat digambar, apakah kemampuan perangkat ini diatur atau tidak. Ketika kemampuan ini diatur, arsitektur perangkat keras tidak memerlukan penembolokan informasi apa pun dan bahwa patch yang tidak di-cache (menangani nol) digambar seefisien yang di-cache.

Patch Gambar

Direct3D 9 mendukung dua jenis primitif berurutan lebih tinggi, atau patch. Ini disebut sebagai patch N-Patch dan Rect/Tri. N-patch dapat dirender menggunakan panggilan penyajian segitiga dengan mengaktifkan N-patch melalui panggilan ke IDirect3DDevice9::SetNPatchMode( nSegments ) dengan nilai nSegments lebih besar dari 1,0. Patch Rect/Tri harus dirender menggunakan titik masuk eksplisit berikut.

Anda dapat menggunakan metode berikut untuk menggambar patch.

IDirect3DDevice9::D rawRectPatch menggambar patch pesanan tinggi persegi panjang yang ditentukan oleh parameter pRectPatchInfo menggunakan aliran yang saat ini diatur. Parameter Handle digunakan untuk mengaitkan patch dengan handel, sehingga saat berikutnya patch digambar, tidak perlu merespecify pRectPatchInfo. Ini memungkinkan untuk melakukan prakomputasi dan penerusan cache koefisien perbedaan atau informasi lain, yang pada gilirannya memungkinkan panggilan berikutnya ke IDirect3DDevice9::D rawRectPatch menggunakan handel yang sama untuk berjalan secara efisien.

Ini dimaksudkan bahwa untuk patch statis, aplikasi akan mengatur shader vertex dan aliran yang sesuai, menyediakan informasi patch dalam parameter pRectPatchInfo, dan menentukan handel sehingga Direct3D dapat menangkap dan menyimpan informasi. Aplikasi kemudian dapat memanggil IDirect3DDevice9::D rawRectPatch kemudian dengan pRectPatchInfo diatur ke NULL untuk menggambar patch secara efisien. Saat menggambar patch yang di-cache, aliran yang saat ini diatur diabaikan. Namun, dimungkinkan untuk mengambil alih pNumSegs yang di-cache dengan menentukan nilai baru untuk pNumSegs. Selain itu, diperlukan untuk mengatur shader vertex yang sama saat merender patch yang di-cache seperti yang ditetapkan saat ditangkap.

Untuk patch dinamis, data patch berubah untuk setiap penyajian patch, sehingga tidak efisien untuk menyimpan informasi. Aplikasi dapat menyampaikan ini ke Direct3D dengan mengatur Handel ke 0. Dalam hal ini, Direct3D menggambar patch menggunakan aliran yang saat ini diatur dan nilai pNumSegs dan tidak menyimpan informasi apa pun. Tidak valid untuk mengatur Handel ke 0 dan pPatch secara bersamaan ke NULL.

Dengan merespeksi pRectPatchInfo untuk handel yang sama, aplikasi dapat menimpa informasi yang di-cache sebelumnya.

IDirect3DDevice9::D rawTriPatch mirip dengan IDirect3DDevice9::D rawRectPatch kecuali gambar patch pesanan tinggi segitiga.

Menghasilkan Koordinat Normal dan Tekstur

Jika Anda menggunakan shader format vertex fleksibel (FVF), pembuatan otomatis normal dan koordinat tekstur tidak dimungkinkan.

Untuk normal, Anda dapat langsung menyediakannya atau meminta Direct3D menghitungnya untuk Anda.

Koordinat yang dihasilkan untuk patch persegi panjang adalah koordinat berbasis spline, seperti yang ditunjukkan dalam ilustrasi berikut.

ilustrasi tekstur asli dan tekstur dengan koordinat berbasis spline

Koordinat yang dihasilkan untuk patch segitiga adalah koordinat berbasis spline barycentric, seperti yang ditunjukkan dalam ilustrasi berikut.

ilustrasi tekstur asli dan tekstur dengan koordinat berbasis spline barycentric

Jika aplikasi harus mengubah rentang koordinat tekstur yang dihasilkan, ini dapat dilakukan menggunakan transformasi tekstur.

Primitif Urutan Lebih Tinggi