Pengantar Buffer di Direct3D 11

Sumber daya buffer adalah kumpulan data yang sepenuhnya diketik yang dikelompokkan ke dalam elemen. Anda dapat menggunakan buffer untuk menyimpan berbagai data, termasuk vektor posisi, vektor normal, koordinat tekstur dalam buffer vertex, indeks dalam buffer indeks, atau status perangkat. Elemen buffer terdiri dari 1 hingga 4 komponen. Elemen buffer dapat menyertakan nilai data yang dikemas (seperti nilai permukaan R8G8B8A8), bilangan bulat 8-bit tunggal, atau empat nilai titik mengambang 32-bit.

Buffer dibuat sebagai sumber daya yang tidak terstruktur. Karena tidak terstruktur, buffer tidak dapat berisi tingkat mipmap apa pun, buffer tidak dapat difilter saat dibaca, dan tidak dapat di-multisampel.

Jenis Buffer

Berikut ini adalah jenis sumber daya buffer yang didukung oleh Direct3D 11. Semua jenis buffer dienkapsulasi oleh antarmuka ID3D11Buffer .

Vertex Buffer

Buffer vertex berisi data vertex yang digunakan untuk menentukan geometri Anda. Data puncak mencakup koordinat posisi, data warna, data koordinat tekstur, data normal, dan sebagainya.

Contoh paling sederhana dari buffer vertex adalah salah satu yang hanya berisi data posisi. Ini dapat divisualisasikan seperti ilustrasi berikut.

illustration of a vertex buffer that contains position data

Lebih sering, buffer vertex berisi semua data yang diperlukan untuk sepenuhnya menentukan simpul 3D. Contohnya bisa menjadi buffer vertex yang berisi posisi per vertex, koordinat normal dan tekstur. Data ini biasanya diatur sebagai set elemen per vertex, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration of a vertex buffer that contains position, normal, and texture data

Buffer vertex ini berisi data per vertex; setiap puncak menyimpan tiga elemen (posisi, normal, dan koordinat tekstur). Posisi dan normal masing-masing biasanya ditentukan menggunakan tiga float 32-bit (DXGI_FORMAT_R32G32B32_FLOAT) dan koordinat tekstur menggunakan dua float 32-bit (DXGI_FORMAT_R32G32_FLOAT).

Untuk mengakses data dari buffer vertex, Anda perlu mengetahui vertex mana yang akan diakses, ditambah parameter buffer tambahan berikut:

  • Offset - jumlah byte dari awal buffer ke data untuk vertex pertama. Anda dapat menentukan offset menggunakan metode ID3D11DeviceContext::IASetVertexBuffers .
  • BaseVertexLocation - jumlah byte dari offset ke vertex pertama yang digunakan oleh panggilan gambar yang sesuai.

Sebelum membuat buffer vertex, Anda perlu menentukan tata letaknya dengan membuat antarmuka ID3D11InputLayout ; ini dilakukan dengan memanggil metode ID3D11Device::CreateInputLayout . Setelah objek input-layout dibuat, Anda dapat mengikatnya ke tahap input-assembler dengan memanggil ID3D11DeviceContext::IASetInputLayout.

Untuk membuat buffer vertex, panggil ID3D11Device::CreateBuffer.

Penyangga Indeks

Buffer indeks berisi offset bilangan buffer ke dalam buffer vertex dan digunakan untuk merender primitif secara lebih efisien. Buffer indeks berisi sekuensial indeks 16-bit atau 32-bit; setiap indeks digunakan untuk mengidentifikasi puncak dalam buffer vertex. Buffer indeks dapat divisualisasikan seperti ilustrasi berikut.

illustration of an index buffer

Indeks berurutan yang disimpan dalam buffer indeks terletak dengan parameter berikut:

Awal Penyangga Indeks = Alamat Dasar Buffer Indeks + Offset (byte) + StartIndexLocation * ElementSize (byte);

Dalam perhitungan ini, ElementSize adalah ukuran setiap elemen buffer indeks, yaitu dua atau empat byte.

Untuk membuat buffer indeks, panggil ID3D11Device::CreateBuffer.

Buffer Konstanta

Buffer konstan memungkinkan Anda untuk secara efisien memasok data konstanta shader ke alur. Anda dapat menggunakan buffer konstanta untuk menyimpan hasil tahap stream-output. Secara konseptual, buffer konstan terlihat seperti buffer vertex elemen tunggal, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration of a shader-constant buffer

Setiap elemen menyimpan konstanta komponen 1-ke-4, yang ditentukan oleh format data yang disimpan. Untuk membuat buffer shader-constant, panggil ID3D11Device::CreateBuffer dan tentukan anggota D3D11_BIND_CONSTANT_BUFFER dari jenis enumerasi D3D11_BIND_FLAG .

Buffer konstanta hanya dapat menggunakan satu bendera ikatan (D3D11_BIND_CONSTANT_BUFFER), yang tidak dapat digabungkan dengan bendera ikat lainnya. Untuk mengikat buffer shader-constant ke alur, panggil salah satu metode berikut: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers, atau ID3D11DeviceContext::VSSetConstantBuffers.

Untuk membaca buffer shader-constant dari shader, gunakan fungsi beban HLSL (misalnya, Load). Setiap tahap shader memungkinkan hingga 15 buffer shader-constant; setiap buffer dapat menampung hingga 4096 konstanta.

Buffer