Pemrosesan Verteks Fungsi Tetap (Direct3D 9)

Dalam alur vertex fungsi tetap, memproses simpul dalam buffer vertex menerapkan matriks transformasi saat ini untuk perangkat. Operasi puncak seperti pencahayaan, menghasilkan bendera klip, dan memperbarui jangkauan juga dapat diterapkan, secara opsional. Saat menggunakan pemrosesan verteks fungsi tetap, memodifikasi elemen di buffer vertex tujuan dikendalikan oleh bendera D3DPV_DONOTCOPYDATA . Bendera ini hanya berlaku untuk pemrosesan vertex fungsi tetap. Antarmuka IDirect3DDevice9 mengekspos metode IDirect3DDevice9::P rocessVertices untuk memproses simpul. Anda memproses simpul dari shader vertex ke kumpulan aliran data input, menghasilkan satu aliran data vertex yang diselingi ke buffer vertex tujuan dengan memanggil metode IDirect3DDevice9::P rocessVertices . Metode ini menerima lima parameter yang menjelaskan lokasi dan kuantitas simpul yang ditargetkan metode, buffer vertex tujuan, dan opsi pemrosesan. Setelah panggilan, buffer tujuan berisi data vertex yang diproses.

Parameter pertama, kedua, dan ketiga, SrcStartIndex, DestIndex, dan VertexCount, mencerminkan indeks puncak pertama yang akan dimuat, indeks dalam buffer tujuan tempat simpul akan ditempatkan, dan jumlah total simpul untuk diproses dan ditempatkan di buffer tujuan. Parameter keempat, pDestBuffer harus diatur ke alamat antarmuka IDirect3DVertexBuffer9 dari objek buffer vertex yang akan menerima simpul sumber. Parameter SrcStartIndex menentukan indeks tempat metode harus mulai memproses simpul.

Parameter akhir, Bendera, menentukan opsi pemrosesan khusus untuk metode . Anda dapat mengatur parameter ini ke 0 untuk pemrosesan vertex default, atau ke D3DPV_DONOTCOPYDATA untuk mengoptimalkan pemrosesan dalam beberapa situasi. Anda juga dapat menggabungkan nilai D3DPV_DONOTCOPYDATA dengan satu atau beberapa nilai D3DLOCK yang sesuai untuk buffer tujuan. Saat Anda mengatur Bendera ke 0, komponen puncak dari format vertex buffer vertex tujuan yang tidak terpengaruh oleh operasi vertex masih disalin dari shader vertex atau diatur ke 0. Namun, saat menggunakan D3DPV_DONOTCOPYDATA, IDirect3DDevice9::P rocessVertices tidak menimpa informasi koordinat warna dan tekstur di buffer tujuan kecuali data ini dihasilkan oleh Direct3D. Warna difus dihasilkan saat pencahayaan diaktifkan, yaitu, D3DRS_LIGHTING diatur ke TRUE. Warna spekular dihasilkan ketika pencahayaan diaktifkan dan spekular diaktifkan, yaitu D3DRS_SPECULARENABLE dan D3DRS_LIGHTING diatur ke TRUE. Warna spekular juga dihasilkan ketika kabut diaktifkan. Koordinat tekstur dihasilkan saat transformasi tekstur atau pembuatan tekstur diaktifkan. IDirect3DDevice9::P rocessVertices menggunakan status render saat ini untuk menentukan pemrosesan puncak apa yang harus dilakukan.

Pengaturan Penggunaan FVF untuk Buffer Vertex Tujuan

Metode IDirect3DDevice9::P rocessVertices memerlukan pengaturan khusus untuk D3DFVF dari buffer vertex tujuan. Pengaturan penggunaan FVF harus kompatibel dengan pengaturan saat ini untuk pemrosesan vertex.

Untuk pemrosesan vertex fungsi tetap, IDirect3DDevice9::P rocessVertices memerlukan pengaturan FVF berikut:

  • Jenis posisi selalu D3DFVF_XYZRHW ; oleh karena itu, D3DFVF_XYZ Dan D3DFVF_XYZB1 melalui D3DFVF_XYZB5 tidak valid.
  • Bendera D3DFVF_NORMAL, D3DFVF_RESERVED0, dan D3DFVF_RESERVED2 tidak boleh diatur.
  • Bendera D3DFVF_DIFFUSE harus diatur jika operasi OR dari kondisi berikut mengembalikan true:
    • Pencahayaan diaktifkan; yaitu, D3DRS_LIGHTING ADALAH TRUE.
    • Pencahayaan dinonaktifkan, warna difus ada di aliran vertex input, dan D3DPV_DONOTCOPYDATA tidak diatur.
  • Bendera D3DFVF_SPECULAR harus diatur jika operasi OR dari kondisi berikut mengembalikan true:
    • Pencahayaan diaktifkan dan warna spekular diaktifkan; yaitu, D3DRS_SPECULARENABLE ADALAH TRUE.
    • Pencahayaan dinonaktifkan, warna spekular ada di aliran puncak input, dan D3DPV_DONOTCOPYDATA tidak diatur.
    • Kabut puncak diaktifkan; artinya, D3DRS_FOGVERTEXMODE tidak diatur ke D3DFOG_NONE.

Selain itu, jumlah koordinat tekstur harus diatur dengan cara berikut:

  • Jika transformasi tekstur dan pembuatan tekstur dinonaktifkan untuk semua tahap tekstur aktif, dan D3DPV_DONOTCOPYDATA tidak diatur, maka jumlah dan jenis koordinat tekstur output diperlukan untuk mencocokkan koordinat tekstur verteks input. Jika D3DPV_DONOTCOPYDATA diatur dan transformasi tekstur dan pembuatan tekstur dinonaktifkan, maka koordinat tekstur output diabaikan.
  • Jika transformasi tekstur atau pembuatan tekstur diaktifkan untuk tahap tekstur aktif apa pun, puncak output mungkin perlu berisi lebih banyak set koordinat tekstur daripada verteks input. Hal ini disebabkan oleh proliferasi koordinat tekstur dari yang dihasilkan oleh pembuatan tekstur atau diturunkan oleh transformasi tekstur. Perhatikan bahwa proliferasi serupa dari koordinat tekstur terjadi selama panggilan IDirect3DDevice9::D rawPrimitive , tetapi tidak terlihat oleh pemrogram aplikasi. Dalam hal ini, Direct3D menghasilkan serangkaian koordinat tekstur baru. Kumpulan koordinat tekstur baru diturunkan dengan melangkah melalui tahap tekstur dan menganalisis pengaturan untuk pembuatan tekstur, transformasi tekstur, dan indeks koordinat tekstur untuk menentukan apakah sekumpulan koordinat tekstur yang unik diperlukan untuk tahap tersebut. Setiap kali set baru diperlukan, set tersebut dialokasikan dalam urutan yang meningkat. Perhatikan bahwa persyaratan maksimum dan khas adalah satu set per tahap, meskipun mungkin kurang karena berbagi koordinat tekstur yang tidak ditransformasi melalui D3DTSS_TEXCOORDINDEX.

Dengan demikian, untuk setiap tahap tekstur, sekumpulan koordinat tekstur baru dihasilkan jika tekstur terikat ke tahap tersebut dan salah satu kondisi berikut ini benar:

  • Pembuatan tekstur diaktifkan untuk tahap tersebut.
  • Transformasi tekstur diaktifkan untuk tahap tersebut.
  • Koordinat tekstur input yang tidak ditransformasi direferensikan melalui D3DTSS_TEXCOORDINDEX untuk pertama kalinya.

Ketika Direct3D menghasilkan koordinat tekstur, aplikasi diperlukan untuk melakukan tindakan berikut:

  1. Gunakan buffer vertex tujuan dengan penggunaan FVF yang sesuai.
  2. Program ulang D3DTSS_TEXCOORDINDEX tahap tekstur sesuai dengan penempatan koordinat tekstur pascaproses. Perhatikan bahwa pemrograman ulang pengaturan D3DTSS_TEXCOORDINDEX terjadi ketika buffer vertex yang diproses digunakan dalam panggilan IDirect3DDevice9::D rawPrimitive dan IDirect3DDevice9::D rawIndexedPrimitive berikutnya.

Terakhir, dimensi koordinat tekstur (D3DFVF_TEX0 melalui D3DFVF_TEX8 ) harus diatur dengan cara berikut:

  • Untuk setiap kumpulan koordinat tekstur, jika transformasi tekstur dan pembuatan tekstur dinonaktifkan, maka dimensi koordinat tekstur output harus cocok dengan input. Jika transformasi tekstur diaktifkan, dimensi output harus cocok dengan jumlah yang ditentukan oleh pengaturan D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3, atau D3DTTFF_COUNT4. Jika transformasi tekstur dinonaktifkan dan pembuatan tekstur diaktifkan, maka dimensi output harus cocok dengan pengaturan untuk mode pembuatan tekstur; saat ini semua mode menghasilkan tiga nilai float.

Ketika IDirect3DDevice9::P rocessVertices gagal karena kode FVF buffer vertex tujuan yang tidak kompatibel, kode yang diharapkan dicetak ke output debug (hanya build debug).

Buffer Puncak