Bayangan laju variabel (VRS)

Motivasi untuk 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 VRS—anti-aliasing multi-sampel dengan supersampling

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.

Dengan bayangan laju variabel (VRS)

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.

Tabel memperlihatkan ukuran piksel kasar untuk tingkat M S A.

Tingkat fitur

Ada dua tingkatan untuk implementasi VRS, dan dua kemampuan yang dapat Anda kueri. Setiap tingkatan dijelaskan secara lebih rinci setelah tabel.

Tabel memperlihatkan fitur yang tersedia di Tingkat 1 dan Tingkat 2.

Tingkat 1

  • 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 2

  • 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 ketika SV_ViewportArrayIndex ditulis.

Daftar kemampuan

  • 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).

Menentukan laju bayangan

Untuk fleksibilitas dalam aplikasi, ada berbagai mekanisme yang disediakan untuk mengontrol tingkat bayangan. Mekanisme yang berbeda tersedia tergantung pada tingkat fitur perangkat keras.

Daftar perintah

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 .

Dukungan ukuran piksel kasar

Tingkat bayangan 1x1, 1x2, 2x1, dan 2x2 didukung pada semua tingkatan.

Ada kemampuan, AdditionalShadingRatesSupported, untuk menunjukkan apakah 2x4, 4x2, dan 4x4 didukung pada perangkat.

Gambar ruang layar (berbasis gambar)

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.

Ukuran petak peta

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

Ukuran gambar ruang layar

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, tata letak, properti sumber daya

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

  1. Tulis data menggunakan shader komputasi; gambar ruang layar terikat sebagai UAV, atau
  2. 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.

Data

Setiap byte gambar ruang layar sesuai dengan nilai enumerasi D3D12_SHADING_RATE .

Status sumber daya

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.

Mengatur gambar

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.

Promosi dan pembbusan

Sumber daya gambar ruang layar tidak memiliki implikasi khusus sehubungan dengan promosi atau pembusukan.

Atribut per primitif

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.

Menggabungkan faktor laju bayangan

Berbagai sumber laju bayangan diterapkan secara berurutan menggunakan diagram ini.

Diagram memperlihatkan status alur, berlabel A, dengan Laju bayangan verteks provokasi, berlabel B, diterapkan pada Combiner, lalu Laju bayangan berbasis gambar, berlabel B, diterapkan pada Combiner.

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.

Daftar combiner

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 .

Status default, dan pengosongan status

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".

Mengkueri laju bayangan dengan menggunakan SV_ShadingRate

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

Jenis semantik ini adalah uint.

Interpretasi data

Data ditafsirkan sebagai nilai enumerasi D3D12_SHADING_RATE .

Jika VRS tidak digunakan

Jika bayangan piksel kasar tidak digunakan, maka SV_ShadingRate dibaca kembali sebagai nilai 1x1, menunjukkan piksel halus.

Perilaku di bawah eksekusi berbasis sampel

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.

Kedalaman dan stensil

Ketika bayangan piksel kasar digunakan, kedalaman dan stensil serta cakupan selalu dihitung dan dipancarkan pada resolusi sampel penuh.

Menggunakan tingkat bayangan yang diminta

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).

Turunan ruang layar

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.

Interpolasi atribut

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.

Pusat

Lokasi interpolasi tengah untuk piksel kasar adalah pusat geometris area piksel kasar penuh. SV_Position selalu diinterpolasi di tengah wilayah piksel kasar.

Sentroid

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

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.

EvaluateAttributeSnapped

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, EvaluateAttributeSnappedparameter 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 EvaluateAttributeSnappedparameter offset untuk setiap ukuran piksel kasar.

Rentang offset EvaluateAttributeSnapped

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, EvaluateAttributeSnappedkisi lokasi yang dapat dievaluasi berpusat di pusat piksel kasar saat menggunakan bayangan piksel kasar.

SetSamplePositions

Ketika API ID3D12GraphicsCommandList1::SetSamplePositions digunakan dengan bayangan kasar, API mengatur posisi sampel untuk piksel halus.

SV_Coverage

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.

Jumlah bit cakupan yang diperlukan

Tabel berikut menunjukkan berapa banyak bit cakupan yang diperlukan untuk setiap kombinasi ukuran piksel kasar dan tingkat MSAA.

Tabel memperlihatkan ukuran piksel kasar, jumlah piksel halus, dan tingkat M S A A.

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).

Pemesanan dan format bit dalam masker cakupan

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 menunjukkan ukuran piksel kasar, diagram piksel kasar, dan bit cakupan 1 x M S A.

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 menunjukkan ukuran piksel kasar, diagram piksel kasar, dan bit cakupan A M S A 2 x.

Tabel berikut menunjukkan 4x piksel MSAA, di mana setiap piksel memiliki empat sampel indeks 0, 1, 2, dan 3.

Tabel memperlihatkan ukuran piksel kasar, diagram piksel kasar, dan bit cakupan A S A 4 x M.

Membuang

Ketika semantik discard HLSL digunakan dengan bayangan piksel kasar, piksel kasar akan dibuang.

Rasterisasi independen target (TIR)

TIR tidak didukung saat bayangan piksel kasar digunakan.

Tampilan pesanan raster (ROV)

Interlock ROV ditentukan sebagai beroperasi pada granularitas piksel halus. Jika bayangan dilakukan per sampel, maka interlock beroperasi pada granularitas sampel.

Rasterisasi konservatif

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.

Cakupan

Ketika rasterisasi konservatif digunakan, semantik cakupan berisi masker penuh untuk piksel halus yang tercakup, dan 0 untuk piksel halus yang tidak tercakup.

Bundel

Anda dapat memanggil API bayangan laju variabel pada bundel.

Render pass

Anda dapat memanggil API bayangan laju variabel dalam kode render.

Memanggil API VRS

Bagian berikutnya ini menjelaskan cara bayangan laju variabel dapat diakses oleh aplikasi Anda melalui Direct3D 12.

Kueri kapabilitas

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;

Tingkat bayangan

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.

Mengatur tingkat bayangan tingkat perintah dan penggabung

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 .

Menyiapkan gambar ruang layar

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.

Mengatur gambar ruang layar

Anda menentukan gambar ruang layar melalui metode ID3D12GraphicsCommandList5::RSSetShadingRateImage .

m_commandList->RSSetShadingRateImage(screenSpaceImage);

Mengkueri ukuran petak peta

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.