Bagikan melalui


Pemrosesan Verteks Fungsi Tetap (Direct3D 9)

Dalam alur vertex fungsi tetap, memproses simpul dalam buffer vertex menerapkan matriks transformasi saat ini untuk perangkat. Operasi vertex seperti pencahayaan, menghasilkan bendera klip, dan memperbarui tingkatan juga dapat diterapkan, secara opsional. Saat menggunakan pemrosesan vertex fungsi tetap, memodifikasi elemen di buffer vertex tujuan dikontrol oleh bendera D3DPV_DONOTCOPYDATA. Bendera ini hanya berlaku untuk pemrosesan verteks fungsi tetap. AntarmukaIDirect3DDevice9memaparkan metodeIDirect3DDevice9::P rocessVertices untuk memproses simpul. Anda memproses simpul dari shader vertex ke kumpulan aliran data input, menghasilkan satu aliran data vertex yang saling terkait 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 vertex pertama yang akan dimuat, indeks dalam buffer tujuan tempat simpul akan ditempatkan, dan jumlah total simpul untuk diproses dan ditempatkan di buffer tujuan, masing-masing. Parameter keempat, pDestBuffer harus diatur ke alamat IDirect3DVertexBuffer9 antarmuka objek buffer vertex yang akan menerima simpul sumber. Parameter SrcStartIndex menentukan indeks di mana metode harus mulai memproses simpul.

Parameter akhir, Bendera, menentukan opsi pemrosesan khusus untuk metode tersebut. 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 vertex dari format vertex buffer 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 vertex apa yang harus dilakukan.

Pengaturan Penggunaan FVF untuk Buffer Vertex Tujuan

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

Untuk pemrosesan verteks 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; artinya, D3DRS_LIGHTING 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; artinya, D3DRS_SPECULARENABLE TRUE.
    • Pencahayaan dinonaktifkan, warna spekular ada di aliran vertex input, dan D3DPV_DONOTCOPYDATA tidak diatur.
    • Kabut vertex 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 vertex 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 berasal dari transformasi tekstur. Perhatikan bahwa proliferasi serupa koordinat tekstur terjadi selama IDirect3DDevice9::D rawPrimitive panggilan, tetapi tidak terlihat oleh programmer aplikasi. Dalam hal ini, Direct3D menghasilkan sekumpulan 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 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 panggilan.

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 Vertex