Bagikan melalui


Contoh Tanda Tangan Akar

Bagian berikut menunjukkan tanda tangan akar yang bervariasi dalam kompleksitas dari kosong hingga penuh sepenuhnya.

Tanda tangan akar kosong

tanda tangan akar kosong tidak memiliki pengikatan

Tanda tangan akar kosong tidak mungkin berguna, tetapi dapat digunakan dalam pass penyajian sepele dengan hanya menggunakan perakitan input, dan vertex minimal dan shader piksel yang tidak mengakses deskriptor apa pun. Juga tahap campuran, target render dan tahap stensil kedalaman tersedia, bahkan dengan tanda tangan akar kosong.

Satu konstanta

satu konstanta akar

Slot pengikatan API adalah tempat argumen akar untuk parameter ini akan terikat pada waktu rekaman daftar perintah. Jumlah slot pengikatan API bersifat implisit, berdasarkan urutan parameter dalam tanda tangan akar (yang pertama selalu nol). Slot pengikatan HLSL adalah tempat shader akan melihat parameter akar muncul. Jenis ("uint" dalam contoh di atas) tidak diketahui oleh perangkat keras tetapi hanya komentar dalam gambar, perangkat keras hanya akan melihat DWORD tunggal sebagai konten.

Untuk mengikat konstanta pada waktu rekaman daftar perintah, perintah yang mirip dengan yang berikut ini akan digunakan:

pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders

Menambahkan Tampilan Buffer Konstanta akar

menambahkan tampilan buffer konstan ke tanda tangan akar

Contoh ini menunjukkan dua konstanta akar, dan Tampilan Buffer Konstanta (CBV) akar yang dikenakan biaya dua slot DWORD.

Untuk mengikat tampilan buffer konstanta, gunakan perintah seperti berikut ini. Perhatikan bahwa parameter pertama (2) adalah slot yang ditampilkan dalam gambar. Biasanya array konstanta akan disiapkan dan kemudian tersedia untuk shader di b0 sebagai CBV.

pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);

Mengikat tabel deskriptor

menambahkan tabel deskriptor ke tanda tangan akar

Contoh ini menunjukkan penggunaan dua tabel deskriptor; satu mendeklarasikan tabel lima deskriptor yang akan tersedia pada waktu eksekusi dalam tumpukan deskriptor CBV_SRV_UAV, dan yang lain mendeklarasikan tabel dua deskriptor yang akan muncul pada waktu eksekusi dalam tumpukan deskriptor sampel.

Untuk mengikat tabel deskriptor saat merekam daftar perintah.

pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);

Fitur lain dari tanda tangan akar adalah konstanta akar float4 yang berukuran empat DWORDS. Perintah berikut hanya mengikat dua DWORDS tengah dari empat.

pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1);  // 2 constants starting at offset 1 (middle 2 values in float4)

Tanda tangan akar yang lebih kompleks

tanda tangan akar kompleks dengan banyak elemen

Contoh ini menunjukkan tanda tangan akar padat dengan sebagian besar jenis entri. Dua tabel deskriptor (pada slot 3 dan 6) menyertakan array ukuran yang tidak terbatas. Beban di sini ada pada aplikasi untuk hanya menyentuh deskriptor yang valid dalam tumpukan. Array yang tidak terbatas, atau sangat besar, memerlukan dukungan pengikatan sumber daya tingkat 2+ perangkat keras.

Ada dua sampel statis (terikat tanpa memerlukan slot tanda tangan root).

Pada slot 9, UAV u4 dan UAV u5 dinyatakan pada offset tabel deskriptor yang sama. Ini adalah penggunaan deskriptor alias, satu deskriptor dalam memori akan muncul sebagai u4 dan u5 dalam shader HLSL. Dalam hal ini shader harus dikompilasi dengan opsi D3D10_SHADER_RESOURCES_MAY_ALIAS, atau opsi atau /res_may_alias di FXC. Deskriptor alias memungkinkan satu deskriptor untuk terikat ke beberapa titik ikatan, tanpa harus membuat perubahan apa pun pada shader.

Tampilan Sumber Daya Streaming Shader

tampilan sumber daya shader streaming di tanda tangan akar ini

Tanda tangan akar ini mengilustrasikan skenario di mana semua SRV dialirkan masuk dan keluar dari satu array besar. Pada waktu eksekusi, tabel deskriptor dapat diatur sekali saat tanda tangan akar diatur. Kemudian semua pembacaan tekstur dilakukan dengan mengindeks ke dalam array melalui konstanta yang disalurkan melalui beberapa argumen akar pertama. Hanya satu tumpukan deskriptor yang diperlukan, dan hanya diperbarui karena tekstur dialirkan ke dalam atau kehabisan slot deskriptor gratis.

Offset deskriptor dalam tumpukan besar diidentifikasi oleh shader menggunakan konstanta dalam Tampilan Buffer Konstanta. Misalnya, jika shader diberi ID material, shader dapat mengindeks ke dalam satu array besar menggunakan konstanta untuk mengakses deskriptor yang diperlukan (yang mereferensikan tekstur yang diperlukan).

Skenario ini memerlukan perangkat keras dengan tingkat pengikatan sumber daya2+.

Tingkat Perangkat Keras Pengikatan Sumber Daya

Pengikatan Sumber Daya di HLSL

Tanda Tangan Akar