Bayangan laju variabel (VRS)
Karena kendala performa, perender grafis tidak selalu mampu memberikan tingkat kualitas yang sama ke setiap bagian dari gambar outputnya. Bayangan laju variabel—atau bayangan piksel kasar—adalah mekanisme yang memungkinkan Anda mengalokasikan performa/daya penyajian pada laju yang bervariasi di seluruh gambar yang Anda render.
Dalam beberapa kasus, tingkat bayangan dapat dikurangi dengan sedikit atau tidak ada pengurangan kualitas output yang terlihat; mengarah ke peningkatan performa yang pada dasarnya gratis.
Tanpa bayangan laju variabel, satu-satunya cara untuk mengontrol laju bayangan adalah dengan multi-sample anti-aliasing (MSAA) dengan eksekusi berbasis sampel (juga dikenal sebagai supersampling).
MSAA adalah mekanisme untuk mengurangi alias geometrik, dan meningkatkan kualitas penyajian gambar dibandingkan dengan tidak menggunakan MSAA. Jumlah sampel MSAA, yang dapat 1x, 2x, 4x, 8x, atau 16x, mengatur jumlah sampel yang dialokasikan per piksel target render. Jumlah sampel MSAA harus diketahui di depan ketika target dialokasikan, dan tidak dapat diubah setelahnya.
Supersampling menyebabkan shader piksel dipanggil sekali per sampel, pada kualitas yang lebih tinggi tetapi juga biaya performa yang lebih tinggi dibandingkan dengan eksekusi per piksel.
Aplikasi Anda dapat mengontrol laju bayangannya dengan memilih antara eksekusi berbasis per piksel, atau MSAA-with-supersampling. Kedua opsi itu tidak memberikan kontrol yang sangat baik. Selain itu, Anda mungkin menginginkan tingkat bayangan yang lebih rendah untuk kelas objek tertentu dibandingkan dengan gambar lainnya. Objek tersebut mungkin mencakup objek di belakang elemen HUD, atau transparansi, kabur (kedalaman bidang, gerakan, dll.), atau distorsi optik karena optik VR. Tetapi itu tidak akan mungkin, karena kualitas bayangan dan biaya diperbaiki di seluruh gambar.
Model variable-rate shading (VRS) memperluas supersampling-with-MSAA ke arah yang berlawanan, "piksel kasar", dengan menambahkan konsep bayangan kasar. Di sinilah bayangan dapat dilakukan pada frekuensi yang lebih kasar daripada piksel. Dengan kata lain, sekelompok piksel dapat dibayangkan sebagai satu unit, dan hasilnya kemudian disiarkan ke semua sampel dalam grup.
API bayangan kasar memungkinkan aplikasi Anda menentukan jumlah piksel yang termasuk dalam grup berbayang, atau piksel kasar. Anda dapat memvariasikan ukuran piksel kasar setelah mengalokasikan target render. Jadi, bagian layar yang berbeda atau pass gambar yang berbeda dapat memiliki tingkat bayangan yang berbeda.
Berikut ini adalah tabel yang menjelaskan tingkat MSAA mana yang didukung dengan ukuran piksel kasar, untuk platform yang mendukung bayangan kasar:
- Untuk sel bertanda Y, kombinasi tersebut diaktifkan.
- Untuk batas bertanda sel, kombinasi tersebut diaktifkan secara kondisional berdasarkan tutup (AdditionalShadingRatesSupported).
- Untuk sel yang kosong, kombinasi tersebut tidak didukung.
- Untuk sel yang berbayang setengahton, kombinasi itu tidak didukung, dan melibatkan pelacakan lebih dari 16 sampel per pemanggilan shader piksel. Untuk melacak lebih dari 16 sampel, ada hambatan penyelarasan perangkat keras tambahan untuk didukung, dibandingkan dengan kasus lain.
Ada dua tingkatan untuk implementasi VRS, dan dua kemampuan yang dapat Anda kueri. Setiap tingkatan dijelaskan secara lebih rinci setelah tabel.
- Tingkat bayangan hanya dapat ditentukan berdasarkan per gambar; tidak lebih terperinci dari itu.
- Tingkat bayangan berlaku secara seragam untuk apa yang digambar secara independen dari tempatnya berada dalam target render.
- Tingkat bayangan dapat ditentukan berdasarkan per gambar, seperti pada Tingkat 1. Ini juga dapat ditentukan oleh kombinasi basis per gambar, dan dari:
- Semantik dari setiap puncak yang memprovokasi, dan
- gambar ruang layar.
- Tingkat bayangan dari tiga sumber digabungkan menggunakan sekumpulan combiner.
- Ukuran petak peta gambar ruang layar adalah 16x16 atau lebih kecil.
- Tingkat bayangan yang diminta oleh aplikasi Anda dijamin akan dikirimkan dengan tepat (untuk presisi filter temporal dan rekonstruksi lainnya).
- SV_ShadingRate input PS didukung.
- Tingkat bayangan per-provokasi -vertex (juga dikenal sebagai per primitif), berlaku ketika satu viewport digunakan dan
SV_ViewportArrayIndex
tidak ditulis. - Tingkat vertex per-provokasi dapat digunakan dengan lebih dari satu viewport jika kemampuan SupportsPerVertexShadingRateWithMultipleViewports diatur ke
true
. Selain itu, dalam hal ini, tarif tersebut dapat digunakan ketikaSV_ViewportArrayIndex
ditulis.
-
AdditionalShadingRatesSupported
- Jenis Boolean.
- Menunjukkan apakah ukuran piksel kasar 2x4, 4x2, dan 4x4 didukung untuk penyajian sampel tunggal; dan apakah ukuran piksel kasar 2x4 didukung untuk 2x MSAA.
-
MendukungPerVertexShadingRateWithMultipleViewports
- Jenis Boolean.
- Menunjukkan apakah lebih dari satu viewport dapat digunakan dengan laju bayangan per puncak (juga dikenal sebagai per primitif).
Untuk fleksibilitas dalam aplikasi, ada berbagai mekanisme yang disediakan untuk mengontrol tingkat bayangan. Mekanisme yang berbeda tersedia tergantung pada tingkat fitur perangkat keras.
Ini adalah mekanisme paling sederhana untuk mengatur tingkat bayangan. Ini tersedia di semua tingkatan.
Aplikasi Anda dapat menentukan ukuran piksel kasar menggunakan metode ID3D12GraphicsCommandList5::RSSetShadingRate. API tersebut mengambil argumen enum tunggal. API memberikan kontrol keseluruhan terhadap tingkat kualitas untuk penyajian—kemampuan untuk mengatur laju bayangan per gambar.
Nilai untuk status ini dinyatakan melalui enumerasi D3D12_SHADING_RATE .
Tingkat bayangan 1x1, 1x2, 2x1, dan 2x2 didukung pada semua tingkatan.
Ada kemampuan, AdditionalShadingRatesSupported, untuk menunjukkan apakah 2x4, 4x2, dan 4x4 didukung pada perangkat.
Pada Tingkat 2 dan yang lebih tinggi, Anda dapat menentukan laju bayangan piksel dengan gambar ruang layar.
Gambar ruang layar memungkinkan aplikasi Anda untuk membuat gambar "masker level-of-detail (LOD) " yang menunjukkan wilayah dengan kualitas yang bervariasi, seperti area yang akan dicakup oleh buram gerakan, kabur kedalaman bidang, objek transparan, atau elemen antarmuka pengguna HUD. Resolusi gambar berada dalam blok makro; itu tidak dalam resolusi target render. Dengan kata lain, data laju bayangan ditentukan pada granularitas petak peta piksel 8x8 atau 16x16, seperti yang ditunjukkan oleh ukuran petak peta VRS.
Aplikasi Anda dapat meminta API untuk mengambil ukuran petak peta VRS yang didukung untuk perangkatnya.
Petak peta persegi, dan ukurannya mengacu pada lebar atau tinggi petak peta dalam texel.
Jika perangkat keras tidak mendukung bayangan laju variabel Tingkat 2, maka kueri kemampuan untuk ukuran petak peta mengembalikan 0.
Jika perangkat keras mendukung bayangan laju variabel Tingkat 2, maka ukuran petak peta adalah salah satu nilai ini.
- 8
- 16
- 32
Untuk target render ukuran {rtWidth, rtHeight}, menggunakan ukuran petak peta tertentu bernama VRSTileSize, gambar ruang layar yang akan mencakupnya adalah dimensi ini.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
Kiri atas gambar ruang layar (0, 0) dikunci ke kiri atas target render (0, 0).
Untuk mencari koordinat (x,y) dari petak peta yang sesuai dengan lokasi tertentu dalam target render, bagi koordinat ruang jendela (x, y) dengan ukuran petak peta, mengabaikan bit pecahan.
Jika gambar ruang layar lebih besar dari yang diperlukan untuk target render tertentu, bagian tambahan di kanan dan/atau bawah tidak digunakan.
Jika gambar ruang layar terlalu kecil untuk target render tertentu, upaya apa pun yang dibaca dari gambar di luar batas aktualnya menghasilkan tingkat bayangan default 1x1. Ini karena kiri atas gambar ruang layar (0, 0) dikunci ke kiri atas target render (0, 0) dan "membaca di luar tingkat target render" berarti membaca nilai yang terlalu besar untuk x dan y.
Format permukaan ini adalah permukaan 8-bit saluran tunggal (DXGI_FORMAT_R8_UINT).
Sumber dayanya adalah dimensi TEXTURE2D.
Ini tidak dapat di array atau dimigrasikan. Ini harus secara eksplisit memiliki satu tingkat mip.
Ini memiliki jumlah sampel 1, dan kualitas sampel 0.
Ini memiliki tata letak tekstur TIDAK DIKETAHUI. Secara implisit tidak boleh tata letak utama baris, karena adaptor silang tidak diizinkan.
Cara yang diharapkan di mana data gambar ruang layar diisi adalah dengan
- Tulis data menggunakan shader komputasi; gambar ruang layar terikat sebagai UAV, atau
- Salin data ke gambar ruang layar.
Saat membuat gambar ruang layar, bendera ini diizinkan.
- TIDAK ADA
- ALLOW_UNORDERED_ACCESS
- DENY_SHADER_RESOURCE
Bendera ini tidak diizinkan.
- ALLOW_RENDER_TARGET
- ALLOW_DEPTH_STENCIL
- ALLOW_CROSS_ADAPTER
- ALLOW_SIMULTANEOUS_ACCESS
- VIDEO_DECODE_REFERENCE_ONLY
Jenis heap sumber daya tidak dapat diUNGGAH atau DIBACA KEMBALI.
Sumber daya tidak dapat SIMULTANEOUS_ACCESS. Sumber daya tidak diizinkan untuk menjadi adaptor silang.
Setiap byte gambar ruang layar sesuai dengan nilai enumerasi D3D12_SHADING_RATE .
Sumber daya perlu ditransisikan ke status baca-saja saat digunakan sebagai gambar ruang layar. Status baca-saja, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, didefinisikan untuk tujuan ini.
Sumber daya gambar ditransisikan keluar dari status tersebut agar dapat ditulis lagi.
Gambar ruang layar untuk menentukan laju shader diatur pada daftar perintah.
Sumber daya yang telah ditetapkan sebagai sumber laju bayangan tidak dapat dibaca atau ditulis dari tahap shader apa pun.
Gambar null
ruang layar dapat diatur untuk menentukan tingkat shader. Ini memiliki efek 1x1 digunakan secara konsisten sebagai kontribusi dari gambar ruang layar. Gambar ruang layar awalnya dapat dianggap diatur ke null
.
Sumber daya gambar ruang layar tidak memiliki implikasi khusus sehubungan dengan promosi atau pembusukan.
Atribut per primitif menambahkan kemampuan untuk menentukan istilah laju bayangan sebagai atribut dari vertex yang memprovokasi. Atribut ini berbayang datar—yaitu, disebarkan ke semua piksel dalam segitiga atau primitif garis saat ini. Penggunaan atribut per primitif dapat memungkinkan kontrol kualitas gambar yang lebih halus dibandingkan dengan penentu laju bayangan lainnya.
Atribut per primitif adalah semantik yang dapat diatur bernama SV_ShadingRate
.
SV_ShadingRate
ada sebagai bagian dari HLSL Shader Model 6.4.
Jika VS atau GS mengatur SV_ShadingRate
, tetapi VRS tidak diaktifkan, maka pengaturan semantik tidak berpengaruh. Jika tidak ada nilai untuk SV_ShadingRate
yang ditentukan per primitif, maka nilai tingkat bayangan 1x1 diasumsikan sebagai kontribusi per primitif.
Berbagai sumber laju bayangan diterapkan secara berurutan menggunakan diagram ini.
Setiap pasangan A dan B digabungkan menggunakan combiner.
* Saat menentukan laju shader berdasarkan atribut vertex.
- Jika shader geometri digunakan, tingkat bayangan dapat ditentukan melalui itu.
- Jika shader geometri tidak digunakan, tingkat bayangan ditentukan oleh vertex yang memprovokasi.
Combiner berikut didukung. Menggunakan Combiner (C) dan dua input (A dan B).
- Passthrough. C.xy = A.xy.
- Ambil alih. C.xy = B.xy.
- Kualitas lebih tinggi. C.xy = min(A.xy, B.xy).
- Kualitas lebih rendah. C.xy = max(A.xy, B.xy).
- Terapkan biaya B relatif terhadap A. C.xy = min(maxRate, A.xy + B.xy).
di mana maxRate
adalah dimensi piksel kasar terbesar yang diizinkan pada perangkat. Ini akan menjadi
-
D3D12_AXIS_SHADING_RATE_2X (yaitu, nilai 1), jika AdditionalShadingRatesSupported adalah
false
. -
D3D12_AXIS_SHADING_RATE_4X (yaitu, nilai 2), jika AdditionalShadingRatesSupported adalah
true
.
Pilihan combiner untuk bayangan laju variabel diatur pada daftar perintah melalui ID3D12GraphicsCommandList5::RSSetShadingRate.
Jika tidak ada combiner yang pernah diatur, maka mereka tetap berada di default, yaitu PASSTHROUGH.
Jika sumber ke combiner adalah D3D12_AXIS_SHADING_RATE, yang tidak diizinkan dalam tabel dukungan, input akan dibersihkan ke tingkat bayangan yang didukung .
Jika output combiner tidak sesuai dengan tingkat bayangan yang didukung pada platform, maka hasilnya dibersihkan ke tingkat bayangan yang didukung .
Semua sumber laju bayangan, yaitu
- tingkat yang ditentukan status alur (ditentukan pada daftar perintah),
- laju yang ditentukan gambar ruang layar, dan
- atribut per primitif
memiliki default D3D12_SHADING_RATE_1X1. Combiner default adalah {PASSTHROUGH, PASSTHROUGH}.
Jika tidak ada gambar ruang layar yang ditentukan, maka tingkat bayangan 1x1 disimpulkan dari sumber tersebut.
Jika tidak ada atribut per primitif yang ditentukan, maka tingkat bayangan 1x1 disimpulkan dari sumber tersebut.
ID3D12CommandList::ClearState mengatur ulang laju yang ditentukan status alur ke default, dan pemilihan gambar ruang layar ke default "tidak ada gambar ruang layar".
Sangat berguna untuk mengetahui tingkat bayangan apa yang dipilih oleh perangkat keras pada pemanggilan shader piksel tertentu. Ini dapat memungkinkan berbagai pengoptimalan dalam kode PS Anda. Variabel sistem khusus PS, SV_ShadingRate
, menyediakan informasi tentang tingkat bayangan.
Jenis semantik ini adalah uint.
Data ditafsirkan sebagai nilai enumerasi D3D12_SHADING_RATE .
Jika bayangan piksel kasar tidak digunakan, maka SV_ShadingRate
dibaca kembali sebagai nilai 1x1, menunjukkan piksel halus.
Shader piksel gagal kompilasi jika input SV_ShadingRate
dan juga menggunakan eksekusi berbasis sampel—misalnya, dengan memasukkan SV_SampleIndex
, atau menggunakan kata kunci interpolasi sampel.
Keterangan tentang bayangan yang ditangguhkan
Lolos pencahayaan aplikasi bayangan yang ditangguhkan mungkin perlu mengetahui tingkat bayangan apa yang digunakan untuk area layar mana. Hal ini agar pengiriman lighting pass dapat diluncurkan dengan kecepatan kasar. Variabel
SV_ShadingRate
dapat digunakan untuk mencapai ini jika ditulis ke gbuffer.
Ketika bayangan piksel kasar digunakan, kedalaman dan stensil serta cakupan selalu dihitung dan dipancarkan pada resolusi sampel penuh.
Untuk semua tingkatan, diharapkan jika tingkat bayangan diminta, dan didukung pada kombinasi tingkat perangkat dan MSAA, maka itu adalah tingkat bayangan yang dikirimkan oleh perangkat keras.
Tingkat bayangan yang diminta berarti tingkat bayangan yang dihitung sebagai output dari combiner (lihat bagian Menggabungkan faktor laju bayangan dalam topik ini).
Tingkat bayangan yang didukung adalah 1x1, 1x2, 2x1, atau 2x2 dalam operasi penyajian di mana jumlah sampel kurang dari atau sama dengan empat. Jika kemampuan AdditionalShadingRatesSupported adalah true
, maka 2x4, 4x2, dan 4x4 juga didukung laju bayangan untuk beberapa jumlah sampel (lihat tabel di bagian Dengan bayangan laju variabel (VRS) dalam topik ini).
Perhitungan gradien piksel ke piksel yang berdekatan dipengaruhi oleh bayangan piksel kasar. Misalnya, ketika piksel kasar 2x2 digunakan, gradien akan menjadi dua kali ukuran dibandingkan dengan ketika piksel kasar tidak digunakan. Aplikasi Anda mungkin ingin menyesuaikan shader untuk mengimbangi ini—atau tidak, tergantung pada fungsionalitas yang Anda inginkan.
Karena mip dipilih berdasarkan turunan ruang layar, penggunaan bayangan piksel kasar memengaruhi pemilihan mip. Penggunaan bayangan piksel kasar menyebabkan mip yang lebih rinci dipilih dibandingkan dengan saat piksel kasar tidak digunakan.
Input ke shader piksel dapat diinterpolasi berdasarkan simpul sumbernya. Karena bayangan laju variabel memengaruhi area target yang ditulis oleh setiap pemanggilan shader piksel, ia berinteraksi dengan interpolasi atribut. Ketiga jenis interpolasi tersebut adalah pusat, sentroid, dan sampel.
Lokasi interpolasi tengah untuk piksel kasar adalah pusat geometris area piksel kasar penuh.
SV_Position
selalu diinterpolasi di tengah wilayah piksel kasar.
Ketika bayangan piksel kasar digunakan dengan MSAA, untuk setiap piksel halus, masih akan ada penulisan ke jumlah lengkap sampel yang dialokasikan untuk tingkat MSAA target. Jadi, lokasi interpolasi sentroid akan mempertimbangkan semua sampel untuk piksel halus dalam piksel kasar. Meskipun demikian, lokasi interpolasi sentroid didefinisikan sebagai sampel pertama yang tercakup, dalam meningkatkan urutan indeks sampel. Cakupan efektif sampel adalah AND-ed dengan bit yang sesuai dari status rasterizer SampleMask.
Catatan
Saat bayangan piksel kasar digunakan pada Tingkat 1, SampleMask selalu merupakan masker lengkap. Jika SampleMask dikonfigurasi agar tidak menjadi masker lengkap, bayangan piksel kasar dinonaktifkan pada Tingkat 1.
Eksekusi berbasis sampel, atau supersampling—yang disebabkan oleh penggunaan fitur interpolasi sampel—dapat digunakan dengan bayangan piksel kasar, dan menyebabkan shader piksel dipanggil per sampel. Untuk target jumlah sampel N, shader piksel dipanggil N kali per piksel halus.
Intrinsik model tarik tidak kompatibel dengan bayangan piksel kasar pada Tingkat 1. Jika ada upaya untuk menggunakan intrinsik model tarik dengan bayangan piksel kasar pada Tingkat 1, maka bayangan piksel kasar secara otomatis dinonaktifkan.
Intrinsik EvaluateAttributeSnapped
diizinkan untuk digunakan dengan bayangan piksel kasar pada Tingkat 2. Sintaksnya sama seperti biasanya.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
Untuk konteks, EvaluateAttributeSnapped
memiliki parameter offset dengan dua bidang. Ketika digunakan tanpa bayangan piksel kasar, hanya empat bit urutan bawah dari tiga puluh dua penuh yang digunakan. Keempat bit ini mewakili rentang [-8, 7]. Rentang ini mencakup kisi 16x16 dalam satu piksel. Rentangnya sia-sia sehingga tepi atas dan kiri piksel disertakan, dan tepi bawah dan kanan tidak. Offset (-8, -8) berada di sudut kiri atas, dan offset (7, 7) berada di sudut kanan bawah. Offset (0, 0) adalah pusat piksel.
Saat digunakan dengan bayangan piksel kasar, EvaluateAttributeSnapped
parameter offset mampu menentukan rentang lokasi yang lebih luas. Parameter offset memilih kisi 16x16 untuk setiap piksel halus, dan ada beberapa piksel halus. Rentang yang dapat diekspresikan dan jumlah bit yang digunakan tergantung pada ukuran piksel kasar. Tepi atas dan kiri piksel kasar disertakan, dan tepi bawah dan kanan tidak.
Tabel di bawah ini menjelaskan interpretasi EvaluateAttributeSnapped
parameter offset untuk setiap ukuran piksel kasar.
Ukuran piksel kasar | Rentang yang dapat diindeks | Ukuran rentang yang dapat diwakili | Jumlah bit yang diperlukan {x, y} | Masker biner bit yang dapat digunakan |
---|---|---|---|---|
1x1 (halus) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {000000000000xxxxx, 000000000000xxxx} |
1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {00000000000xxxxx, 00000000000xxxxxx} |
2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {0000000000xxxxxx, 000000000000xxxx} |
2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {0000000000xxxxxx, 000000000000xxxxxx} |
2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {0000000000xxxxxx, 00000000000xxxxxxx} |
4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {0000000000xxxxxxx, 000000000000xxxxx} |
4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {000000000xxxxxxx, 00000000000xxxxxxx} |
Tabel di bawah ini adalah panduan untuk konversi ke dari representasi tetap ke desimal dan pecahan. Bit pertama yang dapat digunakan dalam masker biner adalah bit tanda, dan sisa masker biner terdiri dari bagian numerik.
Skema angka untuk nilai empat-bit yang diteruskan ke EvaluateAttributeSnapped
tidak spesifik untuk bayangan laju variabel. Hal ini diujarkan kembali di sini untuk kelengkapan.
Untuk nilai empat-bit.
Nilai biner | Desimal | Pecahan |
---|---|---|
1000 | -0,5f | -8 / 16 |
1001 | -0,4375f | -7 / 16 |
1010 | -0,375f | -6 / 16 |
1011 | -0,3125f | -5 / 16 |
1100 | -0,25f | -4 / 16 |
1101 | -0,1875f | -3 / 16 |
1110 | -0,125f | -2 / 16 |
1111 | -0,0625f | -1 /16 |
0000 | 0,0f | 0 / 16 |
0001 | -0,0625f | 1 / 16 |
0010 | -0,125f | 2 / 16 |
0011 | -0,1875f | 3 / 16 |
0100 | -0,25f | 4 / 16 |
0101 | -0,3125f | 5 / 16 |
0110 | -0,375f | 6 / 16 |
0111 | -0,4375f | 7 / 16 |
Untuk nilai lima-bit.
Nilai biner | Desimal | Pecahan |
---|---|---|
10000 | -1 | -16 / 16 |
10001 | -0.9375 | -15 / 16 |
10010 | -0.875 | -14 / 16 |
10011 | -0.8125 | -13 / 16 |
10100 | -0.75 | -12 / 16 |
10101 | -0.6875 | -11 / 16 |
10110 | -0.625 | -10 / 16 |
10111 | -0.5625 | -9 / 16 |
11000 | 0,5 | -8 / 16 |
11001 | -0.4375 | -7 / 16 |
11010 | -0.375 | -6 / 16 |
11011 | -0.3125 | -5 / 16 |
11100 | -0.25 | -4 / 16 |
11101 | -0.1875 | -3 / 16 |
11110 | -0.125 | -2 / 16 |
11111 | -0.0625 | -1 / 16 |
00000 | 0 | 0 / 16 |
00001 | 0.0625 | 1 / 16 |
00010 | 0,125 | 2 / 16 |
00011 | 0.1875 | 3 / 16 |
00100 | 0.25 | 4 / 16 |
00101 | 0.3125 | 5 / 16 |
00110 | 0.375 | 6 / 16 |
00111 | 0.4375 | 7 / 16 |
01000 | 0.5 | 8 / 16 |
01001 | 0.5625 | 9 / 16 |
01010 | 0.625 | 10 / 16 |
01011 | 0.6875 | 11 / 16 |
01100 | 0,75% | 12 / 16 |
01101 | 0.8125 | 13 / 16 |
01110 | 0.875 | 14 / 16 |
01111 | 0.9375 | 15 / 16 |
Untuk nilai enam-bit.
Nilai biner | Desimal | Pecahan |
---|---|---|
100000 | -2 | -32 / 16 |
100001 | -1.9375 | -31 / 16 |
100010 | -1.875 | -30 / 16 |
100011 | -1.8125 | -29 / 16 |
100100 | -1.75 | -28 / 16 |
100101 | -1.6875 | -27 / 16 |
100110 | -1.625 | -26 / 16 |
100111 | -1.5625 | -25 / 16 |
101000 | -1.5 | -24 / 16 |
101001 | -1.4375 | -23 / 16 |
101010 | -1.375 | -22 / 16 |
101011 | -1.3125 | -21 / 16 |
101100 | -1.25 | -20 / 16 |
101101 | -1.1875 | -19 / 16 |
101110 | -1.125 | -18 / 16 |
101111 | -1.0625 | -17 / 16 |
110000 | -1 | -16 / 16 |
110001 | -0.9375 | -15 / 16 |
110010 | -0.875 | -14 / 16 |
110011 | -0.8125 | -13 / 16 |
110100 | -0.75 | -12 / 16 |
110101 | -0.6875 | -11 / 16 |
110110 | -0.625 | -10 / 16 |
110111 | -0.5625 | -9 / 16 |
111000 | 0,5 | -8 / 16 |
111001 | -0.4375 | -7 / 16 |
111010 | -0.375 | -6 / 16 |
111011 | -0.3125 | -5 / 16 |
111100 | -0.25 | -4 / 16 |
111101 | -0.1875 | -3 / 16 |
111110 | -0.125 | -2 / 16 |
111111 | -0.0625 | -1 / 16 |
000000 | 0 | 0 / 16 |
000001 | 0.0625 | 1 / 16 |
000010 | 0,125 | 2 / 16 |
000011 | 0.1875 | 3 / 16 |
000100 | 0.25 | 4 / 16 |
000101 | 0.3125 | 5 / 16 |
000110 | 0.375 | 6 / 16 |
000111 | 0.4375 | 7 / 16 |
001000 | 0.5 | 8 / 16 |
001001 | 0.5625 | 9 / 16 |
001010 | 0.625 | 10 / 16 |
001011 | 0.6875 | 11 / 16 |
001100 | 0,75% | 12 / 16 |
001101 | 0.8125 | 13 / 16 |
001110 | 0.875 | 14 / 16 |
001111 | 0.9375 | 15 / 16 |
010000 | 1 | 16 / 16 |
010001 | 1.0625 | 17 / 16 |
010010 | 1.125 | 18 / 16 |
010011 | 1.1875 | 19 / 16 |
010100 | 1.25 | 20 / 16 |
010101 | 1.3125 | 21 / 16 |
010110 | 1.375 | 22 / 16 |
010111 | 1.4375 | 23 / 16 |
011000 | 1,5 | 24 / 16 |
011001 | 1.5625 | 25 / 16 |
011010 | 1.625 | 26 / 16 |
011011 | 1.6875 | 27 / 16 |
011100 | 1.75 | 28 / 16 |
011101 | 1.8125 | 29 / 16 |
011110 | 1.875 | 30 / 16 |
011111 | 1.9375 | 31 / 16 |
Dengan cara yang sama seperti piksel halus, EvaluateAttributeSnapped
kisi lokasi yang dapat dievaluasi berpusat di pusat piksel kasar saat menggunakan bayangan piksel kasar.
Ketika API ID3D12GraphicsCommandList1::SetSamplePositions digunakan dengan bayangan kasar, API mengatur posisi sampel untuk piksel halus.
Jika SV_Coverage
dinyatakan sebagai input atau output shader pada Tingkat 1, bayangan piksel kasar dinonaktifkan.
Anda dapat menggunakan SV_Coverage
semantik dengan bayangan piksel kasar pada Tingkat 2, dan mencerminkan sampel target MSAA mana yang sedang ditulis.
Saat bayangan piksel kasar digunakan—memungkinkan beberapa piksel sumber terdiri dari petak peta—masker cakupan mewakili semua sampel yang berasal dari petak tersebut.
Mengingat kompatibilitas bayangan piksel kasar dengan MSAA, jumlah bit cakupan yang perlu ditentukan dapat bervariasi. Misalnya, dengan sumber daya MSAA 4x menggunakan D3D12_SHADING_RATE_2x2, setiap piksel kasar menulis ke empat piksel halus, dan setiap piksel halus memiliki empat sampel. Ini berarti bahwa setiap piksel kasar menulis dengan total 4 * 4 = 16 sampel.
Tabel berikut menunjukkan berapa banyak bit cakupan yang diperlukan untuk setiap kombinasi ukuran piksel kasar dan tingkat MSAA.
Seperti yang ditunjukkan dalam tabel, tidak dimungkinkan untuk menggunakan piksel kasar untuk menulis ke lebih dari 16 sampel sekaligus menggunakan fitur bayangan laju variabel yang diekspos melalui Direct3D 12. Pembatasan ini disebabkan oleh batasan Direct3D 12 mengenai tingkat MSAA mana yang diizinkan dengan ukuran piksel kasar (lihat tabel di bagian Dengan bayangan laju variabel (VRS) dalam topik ini).
Bit masker cakupan mematuhi urutan yang terdefinisi dengan baik. Masker terdiri dari cakupan dari piksel dari kiri ke kanan, lalu urutan atas ke bawah (kolom-utama). Bit cakupan adalah bit berurutan rendah dari semantik cakupan, dan padat dikemas bersama-sama.
Tabel di bawah ini menunjukkan format masker cakupan untuk kombinasi ukuran piksel kasar dan tingkat MSAA yang didukung.
Tabel berikut menggambarkan 2x piksel MSAA, di mana setiap piksel memiliki dua sampel indeks 0 dan 1.
Penempatan label sampel pada piksel adalah untuk tujuan ilustrasi, dan tidak selalu menyampaikan lokasi spasial {X, Y} sampel pada piksel tersebut; terutama mengingat bahwa posisi sampel dapat diubah secara terprogram. Sampel disebut oleh indeks berbasis 0 mereka.
Tabel berikut menunjukkan 4x piksel MSAA, di mana setiap piksel memiliki empat sampel indeks 0, 1, 2, dan 3.
Ketika semantik discard
HLSL digunakan dengan bayangan piksel kasar, piksel kasar akan dibuang.
TIR tidak didukung saat bayangan piksel kasar digunakan.
Interlock ROV ditentukan sebagai beroperasi pada granularitas piksel halus. Jika bayangan dilakukan per sampel, maka interlock beroperasi pada granularitas sampel.
Anda dapat menggunakan rasterisasi konservatif dengan bayangan laju variabel. Ketika rasterisasi konservatif digunakan dengan bayangan piksel kasar, piksel halus dalam piksel kasar secara konservatif dirasterisasi dengan diberikan cakupan penuh.
Ketika rasterisasi konservatif digunakan, semantik cakupan berisi masker penuh untuk piksel halus yang tercakup, dan 0 untuk piksel halus yang tidak tercakup.
Anda dapat memanggil API bayangan laju variabel pada bundel.
Anda dapat memanggil API bayangan laju variabel dalam kode render.
Bagian berikutnya ini menjelaskan cara bayangan laju variabel dapat diakses oleh aplikasi Anda melalui Direct3D 12.
Untuk mengkueri kemampuan bayangan laju variabel adaptor, panggil ID3D12Device::CheckFeatureSupport dengan D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6, dan berikan struktur D3D12_FEATURE_DATA_D3D12_OPTIONS6 agar fungsi dapat diisi untuk Anda. Struktur D3D12_FEATURE_DATA_D3D12_OPTIONS6 berisi beberapa anggota, termasuk yang merupakan jenis enumerasi D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier), dan yang menunjukkan apakah pemrosesan latar belakang didukung (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).
Untuk mengkueri kemampuan Tingkat 1, misalnya, Anda bisa melakukan ini.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return
SUCCEEDED(m_device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS6,
&options,
sizeof(options))) &&
options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;
Nilai dalam enumerasi D3D12_SHADING_RATE diatur sehingga laju bayangan mudah diurai menjadi dua sumbu, di mana nilai setiap sumbu diwakili secara ringkas dalam ruang logaritma sesuai dengan enumerasi D3D12_AXIS_SHADING_RATE.
Anda dapat menulis makro untuk menyusun dua laju bayangan sumbu ke dalam laju bayangan seperti ini.
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
D3D12_AXIS_SHADING_RATE_2X,
D3D12_AXIS_SHADING_RATE_1X)
Platform ini juga menyediakan makro ini, yang didefinisikan dalam d3d12.h
.
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
Mereka dapat digunakan untuk membedah dan memahami SV_ShaderRate
.
Catatan
Interpretasi data ini diarahkan untuk menjelaskan gambar ruang layar, yang dapat dimanipulasi oleh shader. Itu dibahas lebih lanjut di bagian di atas. Tetapi tidak ada alasan untuk tidak memiliki definisi yang konsisten dari ukuran piksel kasar yang akan digunakan di mana-mana, termasuk saat mengatur tingkat bayangan tingkat perintah.
Tingkat bayangan dan, secara opsional, combiner ditentukan melalui metode ID3D12GraphicsCommandList5::RSSetShadingRate . Anda meneruskan nilai D3D12_SHADING_RATE untuk laju bayangan dasar, dan array opsional nilai D3D12_SHADING_RATE_COMBINER .
Status sumber daya baca-saja yang menunjuk gambar laju bayangan yang dapat digunakan didefinisikan sebagai D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.
Anda menentukan gambar ruang layar melalui metode ID3D12GraphicsCommandList5::RSSetShadingRateImage .
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Anda dapat mengkueri ukuran petak peta dari anggota D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize . Lihat Kueri kemampuan di atas.
Satu dimensi diambil, karena dimensi horizontal dan vertikal selalu sama. Jika kemampuan sistem D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, maka ukuran petak peta yang dikembalikan adalah 0.