Mengakses Konten Buffer Vertex (Direct3D 9)

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

Parameter terakhir, Bendera, memberi tahu sistem bagaimana memori harus dikunci. Tentukan konstanta untuk parameter Bendera sesuai dengan cara data puncak akan diakses. Pastikan nilai yang dipilih untuk D3DUSAGE cocok dengan nilai yang dipilih untuk D3DLOCK. Misalnya, jika Anda membuat buffer vertex dengan akses tulis saja, tidak masuk akal untuk mencoba membaca data dengan menentukan D3DLOCK_READONLY. Dengan bijak menggunakan bendera ini memungkinkan driver untuk mengunci memori dan memberikan performa terbaik, mengingat jenis akses yang diminta.

Setelah Anda selesai mengisi atau membaca data vertex, panggil metode IDirect3DVertexBuffer9::Unlock , seperti yang ditunjukkan dalam contoh kode berikut.

// This code example assumes the g_pVB is a variable of type 
//   LPDIRECT3DVERTEXBUFFER9 and that g_Vertices has been  
//   properly initialized with vertices

// Lock the buffer to gain access to the vertices 
VOID* pVertices;

if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices), 
        (BYTE**)&pVertices, 0 ) ) ) 
    return E_FAIL;

memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
g_pVB->Unlock();

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

Lihat Menggunakan Buffer Puncak Dinamis dan Indeks untuk informasi tentang menggunakan D3DLOCK_DISCARD atau D3DLOCK_NOOVERWRITE untuk parameter Bendera IDirect3DVertexBuffer9::Lock.

Di C++, karena Anda langsung mengakses memori yang dialokasikan untuk buffer vertex, pastikan aplikasi Anda mengakses memori yang dialokasikan dengan benar. Jika tidak, Anda berisiko merender memori tersebut tidak valid. Gunakan langkah-langkah format puncak yang digunakan aplikasi Anda untuk berpindah dari satu puncak di buffer yang dialokasikan ke buffer lainnya. Memori buffer vertex adalah array simpul sederhana yang ditentukan dalam FVF. Gunakan langkah struktur format puncak apa pun yang Anda tentukan. Anda dapat menghitung langkah setiap puncak pada durasi dengan memeriksa D3DFVF yang terkandung dalam deskripsi buffer vertex. Tabel berikut ini memperlihatkan ukuran untuk setiap komponen vertex.

Bendera Format Puncak Ukuran
D3DFVF_DIFFUSE sizeof(DWORD)
D3DFVF_NORMAL sizeof(float) x 3
D3DFVF_SPECULAR sizeof(DWORD)
D3DFVF_TEXn sizeof(float) x n
D3DFVF_XYZ sizeof(float) x 3
D3DFVF_XYZRHW sizeof(float) x 4

 

Jumlah koordinat tekstur yang ada dalam format puncak dijelaskan oleh bendera D3DFVF_TEX n (di mana n adalah nilai dari 0 hingga 8). Kalikan jumlah kumpulan koordinat tekstur dengan ukuran satu set koordinat tekstur, yang dapat berkisar dari satu hingga empat float, untuk menghitung memori yang diperlukan untuk jumlah koordinat tekstur tersebut.

Gunakan langkah puncak total untuk menaikkan dan mengurangi pointer memori sesuai kebutuhan untuk mengakses simpul tertentu.

Mengambil Deskripsi Buffer Vertex

Anda dapat mengambil informasi tentang buffer vertex dengan memanggil metode IDirect3DVertexBuffer9::GetDesc . Metode ini mengisi anggota struktur D3DVERTEXBUFFER_DESC dengan informasi tentang buffer vertex.

Buffer Puncak