Konstanta Shader (HLSL)

Di Shader Model 4, konstanta shader disimpan dalam satu atau beberapa sumber daya buffer dalam memori. Mereka dapat diatur ke dalam dua jenis buffer: buffer konstan (cbuffer) dan buffer tekstur (tbuffer). Buffer konstan dioptimalkan untuk penggunaan variabel konstanta, yang ditandai dengan akses latensi lebih rendah dan pembaruan yang lebih sering dari CPU. Untuk alasan ini, pembatasan ukuran, tata letak, dan akses tambahan berlaku untuk sumber daya ini. Buffer tekstur diakses seperti tekstur dan berkinerja lebih baik untuk data yang diindeks secara acak. Terlepas dari jenis sumber daya mana yang Anda gunakan, tidak ada batasan jumlah buffer konstan atau buffer tekstur yang dapat dibuat aplikasi.

Mendeklarasikan buffer konstan atau buffer tekstur terlihat sangat mirip dengan deklarasi struktur di C, dengan penambahan kata kunci register dan packoffset untuk menetapkan register atau packing data secara manual.

BufferType [Name] [: register(b#)] { VariableDeclaration [: packoffset(c#.xyzw)]; ... };

Parameter

BufferType

[in] Jenis buffer.

BufferType Deskripsi
cbuffer buffer konstanta
tbuffer buffer tekstur

Nama

[in] Opsional, string ASCII yang berisi nama buffer unik.

register(b#)

[in] Kata kunci opsional, digunakan untuk mengemas data konstanta secara manual. Konstanta dapat dikemas dalam register hanya dalam buffer konstanta, di mana register awal diberikan oleh nomor register (#).

VariableDeclaration

[in] Deklarasi variabel, mirip dengan deklarasi anggota struktur. Ini bisa menjadi jenis HLSL atau objek efek (kecuali tekstur atau objek sampler).

packoffset(c#.xyzw)

[in] Kata kunci opsional, digunakan untuk mengemas data konstanta secara manual. Konstanta dapat dikemas dalam buffer konstanta apa pun, di mana nomor register diberikan oleh (#). Pengemasan sub-komponen (menggunakan xyzw swizzling) tersedia untuk konstanta yang ukurannya pas dalam satu register (jangan melewati batas register). Misalnya, float4 tidak dapat dikemas dalam satu register yang dimulai dengan komponen y karena tidak akan muat dalam register empat komponen.

Keterangan

Buffer konstan mengurangi bandwidth yang diperlukan untuk memperbarui konstanta shader dengan memungkinkan konstanta shader dikelompokkan bersama dan diterapkan pada saat yang sama daripada melakukan panggilan individual untuk melakukan setiap konstanta secara terpisah.

Buffer konstan adalah sumber daya buffer khusus yang diakses seperti buffer. Setiap buffer konstanta dapat menampung hingga 4096 vektor; setiap vektor berisi hingga empat nilai 32-bit. Anda dapat mengikat hingga 14 buffer konstan per tahap alur (2 slot tambahan disediakan untuk penggunaan internal).

Buffer tekstur adalah sumber daya buffer khusus yang diakses seperti tekstur. Akses tekstur (dibandingkan dengan akses buffer) dapat memiliki performa yang lebih baik untuk data yang diindeks secara sewenang-wenang. Anda dapat mengikat hingga 128 buffer tekstur per tahap alur.

Sumber daya buffer dirancang untuk meminimalkan overhead pengaturan konstanta shader. Kerangka kerja efek (lihat ID3D10Effect Interface) akan mengelola pembaruan buffer konstanta dan tekstur, atau Anda dapat menggunakan API Direct3D untuk memperbarui buffer (lihat Menyalin dan Mengakses Data Sumber Daya (Direct3D 10) untuk informasi). Aplikasi juga dapat menyalin data dari buffer lain (seperti target render atau target stream-output) ke dalam buffer konstanta.

Untuk informasi selengkapnya tentang menggunakan buffer konstanta dalam aplikasi D3D10, lihat Jenis Sumber Daya (Direct3D 10) dan Membuat Sumber Daya Buffer (Direct3D 10).

Untuk informasi selengkapnya tentang menggunakan buffer konstanta dalam aplikasi D3D11, lihat Pengantar Buffer di Direct3D 11 dan Cara: Membuat Buffer Konstanta.

Buffer konstan tidak memerlukan tampilan untuk terikat ke alur. Namun, buffer tekstur memerlukan tampilan dan harus terikat ke slot tekstur (atau harus terikat dengan SetTextureBuffer saat menggunakan efek).

Ada dua cara untuk mengemas data konstanta: menggunakan kata kunci register (DirectX HLSL) dan packoffset (DirectX HLSL ).

Perbedaan antara Direct3D 9 dan Direct3D 10 dan 11:

  • Tidak seperti alokasi otomatis konstanta di Direct3D 9, yang tidak melakukan pengemasan dan sebaliknya menetapkan setiap variabel ke satu set register float4, variabel konstan HLSL mengikuti aturan pengemasan di Direct3D 10 dan 11.

Mengatur buffer konstan

Buffer konstan mengurangi bandwidth yang diperlukan untuk memperbarui konstanta shader dengan memungkinkan konstanta shader dikelompokkan bersama dan diterapkan pada saat yang sama daripada melakukan panggilan individual untuk melakukan setiap konstanta secara terpisah.

Cara terbaik untuk menggunakan buffer konstanta secara efisien adalah dengan mengatur variabel shader ke dalam buffer konstan berdasarkan frekuensi pembaruannya. Ini memungkinkan aplikasi untuk meminimalkan bandwidth yang diperlukan untuk memperbarui konstanta shader. Misalnya, shader mungkin mendeklarasikan dua buffer konstan dan mengatur data di masing-masing berdasarkan frekuensi pembaruan mereka: data yang perlu diperbarui berdasarkan per objek (seperti matriks dunia) dikelompokkan ke dalam buffer konstan yang dapat diperbarui untuk setiap objek. Ini terpisah dari data yang mencirikan adegan dan oleh karena itu kemungkinan akan diperbarui jauh lebih jarang (ketika adegan berubah).

cbuffer myObject
{       
    float4x4 matWorld;
    float3   vObjectPosition;
    int      arrayIndex;
}
 
cbuffer myScene
{
    float3   vSunPosition;
    float4x4 matView;
}
        

Buffer konstanta default

Ada dua buffer konstanta default yang tersedia, $Global dan $Param. Variabel yang ditempatkan dalam cakupan global ditambahkan secara implisit ke $Global cbuffer, menggunakan metode pengemasan yang sama yang digunakan untuk cbuffer. Parameter seragam dalam daftar parameter fungsi muncul di $Param buffer konstan saat shader dikompilasi di luar kerangka kerja efek. Ketika dikompilasi di dalam kerangka kerja efek, semua seragam harus diselesaikan ke variabel yang ditentukan dalam cakupan global.

Contoh

Berikut adalah contoh dari Skinning10 Sample yang merupakan buffer tekstur yang terdiri dari array matriks.

tbuffer tbAnimMatrices
{
    matrix g_mTexBoneWorld[MAX_BONE_MATRICES];
};
      

Contoh deklarasi ini secara manual menetapkan buffer konstan untuk memulai pada register tertentu, dan juga mengemas elemen tertentu dengan subkomponen.

cbuffer MyBuffer : register(b3)
{
    float4 Element1 : packoffset(c0);
    float1 Element2 : packoffset(c1);
    float1 Element3 : packoffset(c1.y);
}
      

Model Shader 4