Bagikan melalui


Buffer Indeks (Direct3D 9)

Buffer indeks, yang diwakili oleh antarmuka IDirect3DIndexBuffer9 , adalah buffer memori yang berisi data indeks. Data indeks, atau indeks, adalah offset bilangan bulat ke dalam buffer vertex dan digunakan untuk merender primitif menggunakan metode IDirect3DDevice9::D rawIndexedPrimitive.

Buffer vertex berisi simpul; oleh karena itu, Anda dapat menggambar buffer vertex baik dengan atau tanpa primitif terindeks. Namun, karena buffer indeks berisi indeks, Anda tidak dapat menggunakan buffer indeks tanpa buffer vertex yang sesuai. (Sebagai catatan samping, IDirect3DDevice9::D rawIndexedPrimitiveUP dan IDirect3DDevice9::D rawPrimitiveUP adalah satu-satunya metode gambar yang menggambar tanpa indeks atau buffer vertex.)

Deskripsi Buffer Indeks

Buffer indeks dijelaskan dalam hal kemampuannya, seperti di mana ia ada dalam memori, apakah itu mendukung pembacaan dan penulisan, dan jenis dan jumlah indeks yang dapat dikandungnya. Sifat-sifat ini diadakan dalam struktur D3DINDEXBUFFER_DESC.

Deskripsi buffer indeks memberi tahu aplikasi Anda bagaimana buffer yang ada dibuat. Anda menyediakan struktur deskripsi kosong bagi sistem untuk mengisi dengan kemampuan buffer indeks yang dibuat sebelumnya.

  • Anggota Format menjelaskan format permukaan data buffer indeks.
  • Jenis mengidentifikasi jenis sumber daya buffer indeks.
  • Anggota struktur Penggunaan berisi bendera kemampuan umum. Bendera D3DUSAGE_SOFTWAREPROCESSING menunjukkan bahwa buffer indeks akan digunakan dengan pemrosesan verteks perangkat lunak. Kehadiran bendera D3DUSAGE_WRITEONLY dalam Penggunaan menunjukkan bahwa memori buffer indeks hanya digunakan untuk operasi tulis. Ini membebaskan driver untuk menempatkan data indeks di lokasi memori terbaik untuk memungkinkan pemrosesan dan penyajian yang cepat. Jika bendera D3DUSAGE_WRITEONLY tidak digunakan, driver cenderung tidak menempatkan data di lokasi yang tidak efisien untuk operasi baca. Ini mengorbankan beberapa kecepatan pemrosesan dan penyajian. Jika bendera ini tidak ditentukan, diasumsikan bahwa aplikasi melakukan operasi baca dan tulis pada data dalam buffer indeks.
  • Kumpulan menentukan kelas memori yang dialokasikan untuk buffer indeks. Bendera D3DPOOL_SYSTEMMEM menunjukkan bahwa sistem membuat buffer indeks dalam memori sistem.
  • Anggota Ukuran menyimpan ukuran, dalam byte, dari data buffer vertex.
  • Parameter terakhir pSharedHandle tidak digunakan. Atur ke NULL.

Persyaratan Pemrosesan Indeks

Performa operasi pemrosesan indeks sangat bergantung pada di mana buffer indeks ada dalam memori dan jenis perangkat penyajian apa yang digunakan. Aplikasi mengontrol alokasi memori untuk buffer indeks saat dibuat. Ketika bendera memori D3DPOOL_SYSTEMMEM diatur, buffer indeks dibuat dalam memori sistem. Ketika bendera memori D3DPOOL_DEFAULT digunakan, driver perangkat menentukan di mana memori untuk buffer indeks paling baik dialokasikan, sering disebut sebagai memori optimal driver. Memori optimal driver dapat berupa memori video lokal, memori video non-lokal, atau memori sistem.

Mengatur bendera perilaku D3DUSAGE_SOFTWAREPROCESSING saat memanggil metode IDirect3DDevice9::CreateIndexBuffer menentukan bahwa buffer indeks akan digunakan dengan pemrosesan vertex perangkat lunak. Bendera ini diperlukan dalam pemrosesan vertex mode campuran (D3DCREATE_MIXED_VERTEXPROCESSING) saat pemrosesan vertex perangkat lunak digunakan.

Aplikasi dapat langsung menulis indeks ke buffer indeks yang dialokasikan dalam memori optimal driver. Teknik ini mencegah operasi salinan redundan nanti. Teknik ini tidak berfungsi dengan baik jika aplikasi Anda membaca data kembali dari buffer indeks, karena operasi baca yang dilakukan oleh host dari memori optimal driver bisa sangat lambat. Oleh karena itu, jika aplikasi Anda perlu membaca selama pemrosesan atau menulis data ke buffer secara erratis, buffer indeks memori sistem adalah pilihan yang lebih baik.

Catatan

Selalu gunakan D3DPOOL_DEFAULT, kecuali jika Anda tidak ingin menggunakan memori video atau menggunakan RAM terkunci halaman dalam jumlah besar saat driver memasukkan buffer verteks atau indeks ke dalam memori AGP.

 

Membuat Penyangga Indeks

Buat objek buffer indeks dengan memanggil metode IDirect3DDevice9::CreateIndexBuffer , yang menerima enam parameter.

  • Parameter pertama menentukan panjang buffer indeks, dalam byte.

  • Parameter kedua adalah serangkaian kontrol penggunaan. Antara lain, nilainya menentukan apakah simpul yang dirujuk oleh indeks mampu berisi informasi kliping. Untuk meningkatkan performa, tentukan D3DUSAGE_DONOTCLIP saat pengklipan tidak diperlukan.

    Bendera D3DUSAGE_SOFTWAREPROCESSING dapat diatur ketika mode campuran atau pemrosesan verteks perangkat lunak (D3DCREATE_MIXED_VERTEXPROCESSING /D3DCREATE_SOFTWARE_VERTEXPROCESSING) diaktifkan untuk perangkat tersebut. D3DUSAGE_SOFTWAREPROCESSING harus diatur agar buffer digunakan dengan pemrosesan puncak perangkat lunak dalam mode campuran, tetapi tidak boleh diatur untuk performa terbaik saat menggunakan pemrosesan indeks perangkat keras dalam mode campuran (D3DCREATE_HARDWARE_VERTEXPROCESSING). Namun, pengaturan D3DUSAGE_SOFTWAREPROCESSING adalah satu-satunya opsi ketika satu buffer digunakan dengan pemrosesan verteks perangkat keras dan perangkat lunak. D3DUSAGE_SOFTWAREPROCESSING diperbolehkan untuk perangkat campuran dan perangkat lunak.

    Dimungkinkan untuk memaksa buffer puncak dan indeks ke dalam memori sistem dengan menentukan D3DPOOL_SYSTEMMEM, bahkan ketika pemrosesan indeks sedang dilakukan di perangkat keras. Ini adalah cara untuk menghindari memori yang dikunci halaman dalam jumlah besar ketika driver memasukkan buffer ini ke dalam memori AGP.

  • Parameter ketiga adalah anggota D3DFMT_INDEX16 atau D3DFMT_INDEX32 dari jenis enumerasi D3DFORMAT yang menentukan ukuran setiap indeks.

  • Parameter keempat adalah anggota jenis enumerasi D3DPOOL yang memberi tahu sistem di mana dalam memori untuk menempatkan buffer indeks baru.

  • Parameter akhir yang diterima IDirect3DDevice9::CreateIndexBuffer adalah alamat variabel yang diisi dengan pointer ke antarmuka IDirect3DIndexBuffer9 baru dari objek buffer vertex, jika panggilan berhasil.

Contoh kode C++ berikut menunjukkan seperti apa membuat buffer indeks dalam kode.

/*
 * For the purposes of this example, the d3dDevice variable is the 
 * address of an IDirect3DDevice9 interface exposed by a 
 * Direct3DDevice object, g_IB is a variable of type 
 * LPDIRECT3DINDEXBUFFER9.
 */

if( FAILED( d3dDevice->CreateIndexBuffer( 16384 *sizeof(WORD),
           D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, 
           &g_IB, NULL ) ) )
    return E_FAIL;

Mengakses Penyangga Indeks

Objek buffer indeks memungkinkan aplikasi untuk langsung mengakses memori yang dialokasikan untuk data indeks. Anda dapat mengambil penunjuk untuk mengindeks memori buffer dengan memanggil metode IDirect3DIndexBuffer9::Lock , lalu mengakses memori sesuai kebutuhan untuk mengisi buffer dengan data indeks baru atau membaca data apa pun yang ada di dalamnya. Metode Lock menerima empat parameter. Yang pertama, OffsetToLock, adalah offset ke dalam data indeks. Parameter kedua adalah ukuran, diukur dalam byte, dari data indeks. Parameter ketiga yang diterima oleh metode IDirect3DIndexBuffer9::Lock , ppbData, adalah alamat pointer BYTE yang diisi dengan pointer ke data indeks, jika panggilan berhasil.

Parameter terakhir, Bendera, memberi tahu sistem bagaimana memori harus dikunci. Anda dapat menggunakannya untuk menunjukkan bagaimana aplikasi mengakses data di buffer. Tentukan konstanta untuk parameter Bendera sesuai dengan cara data indeks akan diakses oleh aplikasi Anda. Ini memungkinkan driver untuk mengunci memori dan memberikan performa terbaik mengingat jenis akses yang diminta. Gunakan bendera D3DLOCK_READONLY jika aplikasi Anda hanya akan membaca dari memori buffer indeks. Termasuk bendera ini memungkinkan Direct3D untuk mengoptimalkan prosedur internalnya untuk meningkatkan efisiensi, mengingat bahwa akses ke memori akan bersifat baca-saja.

Setelah Anda mengisi atau membaca data indeks, panggil metode IDirect3DIndexBuffer9::Unlock , seperti yang ditunjukkan dalam contoh kode berikut.

// This code example assumes the m_pIndexBuffer is a variable of type 
// LPDIRECT3DINDEXBUFFER9 and that g_Indices has been properly 
// initialized with indices.

// To fill the index buffer, you must lock the buffer to gain 
// access to the indices. This mechanism is required because index
// buffers may be in device memory.

VOID* pIndices;

if( FAILED( m_pIndexBuffer->Lock( 
      0,                 // Fill from start of the buffer
      sizeof(g_Indices), // Size of the data to load
      BYTE**)&pIndices,  // Returned index data
      0 ) ) )            // Send default flags to the lock
{
    SAFE_RELEASE(m_pIndexBuffer);
    return E_FAIL;
}

memcpy( pIndices, g_Indices, sizeof(g_Indices) );
m_pIndexBuffer->Unlock();

Catatan

Jika Anda membuat buffer indeks dengan bendera D3DUSAGE_WRITEONLY, jangan gunakan bendera penguncian D3DLOCK_READONLY. Gunakan bendera D3DLOCK_READONLY jika aplikasi Anda hanya akan membaca dari memori buffer indeks. Termasuk bendera ini memungkinkan Direct3D untuk mengoptimalkan prosedur internalnya untuk meningkatkan efisiensi, mengingat bahwa akses ke memori akan bersifat baca-saja.

Untuk informasi tentang menggunakan D3DLOCK_DISCARD atau D3DLOCK_NOOVERWRITE untuk parameter Bendera metode IDirect3DIndexBuffer9::Lock, lihat Pengoptimalan Performa (Direct3D 9).

 

Di C++, karena Anda langsung mengakses memori yang dialokasikan untuk buffer indeks, pastikan aplikasi Anda mengakses memori yang dialokasikan dengan benar. Jika tidak, Anda berisiko merender memori tersebut tidak valid. Gunakan langkah-langkah format indeks yang digunakan aplikasi Anda untuk berpindah dari satu indeks di buffer yang dialokasikan ke indeks lain.

Ambil informasi tentang buffer indeks dengan memanggil metode IDirect3DIndexBuffer9::GetDesc. Metode ini mengisi anggota struktur D3DINDEXBUFFER_DESC dengan informasi tentang buffer indeks.

Sumber Daya Direct3D

Penyajian dari Buffer Vertex dan Indeks (Direct3D 9)

Buffer Vertex (Direct3D 9)