Pengantar buffer

Sumber daya buffer adalah kumpulan data yang sepenuhnya diketik, dikelompokkan ke dalam elemen. Buffer menyimpan data, seperti koordinat tekstur dalam buffer vertex, indeks dalam buffer indeks, data konstanta shader dalam buffer konstan, vektor posisi, vektor normal, 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.

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 dan koordinat tekstur menggunakan dua float 32-bit.

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.
  • BaseVertexLocation - jumlah byte dari offset ke vertex pertama yang digunakan oleh panggilan gambar yang sesuai.

Sebelum membuat buffer vertex, Anda perlu menentukan tata letaknya. Setelah objek tata letak input dibuat, Anda mengikatnya ke tahap Perakit Input (IA).

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:

  • Offset - jumlah byte dari alamat dasar buffer indeks.
  • StartIndexLocation - menentukan elemen buffer indeks pertama dari alamat dasar dan offset. Lokasi mulai mewakili indeks pertama yang akan dirender.
  • IndexCount - jumlah indeks yang akan dirender.

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.

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.

Buffer konstanta hanya dapat menggunakan satu bendera ikatan , yang tidak dapat digabungkan dengan bendera ikat lainnya.

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

Buffer puncak dan indeks