Bagikan melalui


Rasterisasi Konservatif Direct3D 12

Rasterisasi Konservatif menambahkan beberapa kepastian pada penyajian piksel, yang sangat membantu khususnya untuk algoritma deteksi tabrakan.

Gambaran Umum

Rasterisasi Konservatif berarti bahwa semua piksel yang setidaknya dicakup sebagian oleh primitif yang dirender dirasterisasi, yang berarti bahwa shader piksel dipanggil. Perilaku normal adalah pengambilan sampel, yang tidak digunakan jika Rasterisasi Konservatif diaktifkan.

Rasterisasi Konservatif berguna dalam sejumlah situasi, termasuk untuk kepastian dalam deteksi tabrakan, oklusi pemusnahan, dan penyajian ubin.

Misalnya, gambar berikut menunjukkan segitiga hijau yang dirender menggunakan Rasterisasi Konservatif, seperti yang akan muncul di rasterizer (yaitu, menggunakan 16,8 koordinat puncak titik tetap). Area coklat dikenal sebagai "wilayah ketidakpastian" - wilayah konseptual yang mewakili batas segitiga yang diperluas, diperlukan untuk memastikan primitif dalam rasterizer konservatif sehubungan dengan koordinat puncak titik apung asli. Kotak merah di setiap puncak menunjukkan bagaimana wilayah ketidakpastian dihitung: sebagai kuadrat sapuan.

Kotak abu-abu besar menunjukkan piksel yang akan dirender. Kotak merah muda menunjukkan piksel yang dirender menggunakan "Aturan Kiri Atas", yang diputar saat tepi segitiga melintasi tepi piksel. Mungkin ada positif palsu (set piksel yang seharusnya tidak) yang biasanya akan dimusnahkan oleh sistem tetapi tidak selalu dimusnahkan.

aturan kiri atas

Interaksi dengan alur

Interaksi Aturan Rasterisasi

Dalam mode Rasterisasi Konservatif, Aturan Rasterisasi menerapkan cara yang sama seperti ketika mode Rasterisasi Konservatif tidak diaktifkan dengan pengecualian untuk Aturan Top-Left, yang dijelaskan di atas, dan Cakupan Piksel. 16.8 Fixed-Point presisi Rasterizer harus digunakan.

Piksel yang tidak akan tercakup jika perangkat keras menggunakan koordinat puncak titik mengambang penuh hanya dapat disertakan jika berada dalam wilayah yang tidak pasti tidak lebih besar setengah piksel di domain titik tetap. Perangkat keras di masa mendatang diharapkan dapat mencapai wilayah ketidakpastian yang diperketat yang ditentukan di Tingkat 2. Perhatikan bahwa persyaratan ini mencegah segitiga geser meluas lebih jauh dari yang diperlukan.

Wilayah ketidakpastian valid serupa juga berlaku untuk InnerCoverage , tetapi lebih ketat karena tidak ada implementasi yang membutuhkan wilayah ketidakpastian yang lebih besar untuk kasus ini. Lihat Interaksi InnerCoverage untuk detail selengkapnya.

Wilayah ketidakpastian dalam dan luar harus lebih besar dari atau sama dengan ukuran setengah kisi sub-piksel, atau 1/512 piksel, di domain titik tetap. Ini adalah wilayah ketidakpastian minimum yang valid. 1/512 berasal dari representasi koordinat Rasterizer titik tetap 16,8 dan aturan round-to-nearest yang berlaku saat mengonversi koordinat puncak titik mengambang menjadi 16,8 koordinat titik tetap. 1/512 dapat berubah jika presisi Rasterizer berubah. Jika implementasi menerapkan wilayah ketidakpastian minimum ini, maka mereka harus mengikuti Aturan Top-Left saat tepi atau sudut wilayah ketidakpastian berada di sepanjang tepi atau sudut piksel. Tepi yang dipotong dari wilayah ketidakpastian harus diperlakukan sebagai puncak terdekat, yang berarti bahwa itu dihitung sebagai dua tepi: dua yang bergabung di puncak terkait. Top-Left Aturan diperlukan ketika wilayah ketidakpastian minimum digunakan karena jika tidak, maka implementasi Rasterisasi Konservatif akan gagal mem-rasterisasi piksel yang dapat dicakup saat mode Rasterisasi Konservatif dinonaktifkan.

Diagram berikut mengilustrasikan wilayah ketidakpastian luar yang valid yang dihasilkan dengan menyapu persegi di sekitar tepi primitif di domain titik tetap (yaitu puncak telah diukur oleh representasi titik tetap 16,8). Dimensi persegi ini didasarkan pada ukuran wilayah ketidakpastian luar yang valid: untuk 1/2 piksel, persegi memiliki lebar dan tinggi 1 piksel, untuk 1/512 piksel, persegi memiliki lebar dan tinggi 1/256 piksel. Segitiga hijau mewakili primitif tertentu, garis putus-putus merah mewakili batas pada Overestimated Conservative Rasterization, kotak hitam padat mewakili persegi yang disapu di sepanjang tepi primitif, dan area kotak-kotak biru adalah wilayah ketidakpastian luar:

wilayah ketidakpastian luar.

Interaksi multisampling

Terlepas dari jumlah sampel di permukaan RenderTarget/DepthStencil (atau apakah ForcedSampleCount sedang digunakan atau tidak), semua sampel dicakup untuk piksel yang dirasterisasi oleh Conservative Rasterization. Lokasi sampel individual tidak diuji apakah lokasi tersebut jatuh dalam primitif atau tidak.

Interaksi SampleMask

Status SampleMask Rasterizer menerapkan cara yang sama seperti ketika Rasterisasi Konservatif tidak diaktifkan untuk InputCoverage, tetapi tidak mempengaruhi InnerCoverage (yaitu tidak AND dimasukkan ke dalam input yang dideklarasikan dengan InnerCoverage). Ini karena InnerCoverage tidak terkait dengan apakah sampel MSAA ditutupi: 0 InnerCoverage hanya berarti bahwa piksel tidak dijamin sepenuhnya tercakup, bukan berarti tidak ada sampel yang akan diperbarui.

Interaksi Kedalaman/Uji Stensil

Pengujian Kedalaman/Stensil berlanjut untuk piksel yang dirasterisasi secara konservatif dengan cara yang sama seolah-olah semua sampel dicakup ketika Rasterisasi Konservatif tidak diaktifkan.

Melanjutkan dengan semua sampel yang tercakup dapat menyebabkan Ekstrapolasi Kedalaman, yang valid dan harus dijepit ke viewport seperti yang ditentukan ketika Rasterisasi Konservatif tidak diaktifkan. Ini mirip dengan ketika mode interpolasi frekuensi piksel digunakan pada RenderTarget dengan jumlah sampel yang lebih besar dari 1, meskipun dalam kasus Rasterisasi Konservatif, ini adalah nilai kedalaman yang masuk ke pengujian kedalaman fungsi tetap yang dapat diekstrapolasi.

Perilaku culling Kedalaman Awal dengan Ekstrapolasi Kedalaman tidak terdefinisi. Ini karena beberapa perangkat keras culling Kedalaman Awal tidak dapat mendukung nilai kedalaman yang diekstrapolasi dengan benar. Namun, perilaku culling Kedalaman Awal di hadapan Extrapolasi Kedalaman bermasalah bahkan dengan perangkat keras yang dapat mendukung nilai kedalaman yang diekstrapolasi. Masalah ini dapat ditangani dengan menjepit kedalaman input Pixel Shader ke nilai kedalaman min dan maks dari primitif yang dirasterisasi dan menulis nilai tersebut ke oDepth (register kedalaman output shader piksel). Implementasi diperlukan untuk menonaktifkan culling Kedalaman Awal dalam hal ini, karena penulisan oDepth .

Interaksi Helper Pixel

Aturan Helper Pixel menerapkan cara yang sama seperti ketika Rasterisasi Konservatif tidak diaktifkan. Sebagai bagian dari ini, semua piksel termasuk Piksel Pembantu harus melaporkan InputCoverage secara akurat seperti yang ditentukan di bagian InputCoverage interaksi. Jadi piksel yang sepenuhnya tidak tercakup melaporkan cakupan 0.

Interaksi Cakupan Output

Cakupan Output (oMask) berperilaku untuk piksel yang dirasterisasi secara konservatif seperti saat Rasterisasi Konservatif tidak diaktifkan dengan semua sampel tercakup.

Interaksi InputCoverage

Dalam mode Rasterisasi Konservatif, register input ini diisi seolah-olah semua sampel tercakup ketika Rasterisasi Konservatif tidak diaktifkan untuk piksel tertentu yang dirasterisasi secara konservatif. Artinya, semua interaksi yang ada berlaku (misalnya SampleMask diterapkan), dan bit n pertama dari InputCoverage LSB diatur ke 1 untuk piksel yang diraster secara konservatif, mengingat sampel n per piksel RenderTarget dan/atau batas buffer DepthStencil di Output Merger, atau sampel n ForcedSampleCount. Sisa bit adalah 0.

Input ini tersedia dalam shader terlepas dari penggunaan Rasterisasi Konservatif, meskipun Conservative Rasterization mengubah perilakunya untuk hanya menampilkan semua sampel yang tercakup (atau tidak ada untuk Helper Pixels).

Interaksi InnerCoverage

Fitur ini diperlukan oleh, dan hanya tersedia di, Tingkat 3. Runtime akan gagal membuat shader untuk shader yang menggunakan mode ini saat implementasi mendukung Tingkat kurang dari Tingkat 3.

Pixel Shader memiliki Sistem Bilangan Bulat Skalar 32-bit Yang Menghasilkan Nilai yang tersedia: InnerCoverage. Ini adalah bidang bit yang memiliki bit 0 dari LSB yang diatur ke 1 untuk piksel tertentu yang dirasterisasi secara konservatif, hanya ketika piksel tersebut dijamin sepenuhnya berada di dalam primitif saat ini. Semua bit register input lainnya harus diatur ke 0 ketika bit 0 tidak diatur, tetapi tidak terdefinisi ketika bit 0 diatur ke 1 (pada dasarnya, bidang bit ini mewakili nilai Boolean di mana false harus tepat 0, tetapi benar bisa ganjil (yaitu bit 0 diatur) nilai bukan nol). Input ini digunakan untuk informasi Rasterisasi Konservatif yang diremehkan. Ini menginformasikan Pixel Shader apakah piksel saat ini terletak sepenuhnya di dalam geometri.

Ini harus memperkirakan kesalahan snapping pada resolusi yang lebih besar dari atau sama dengan resolusi di mana Draw saat ini beroperasi. Tidak boleh ada positif palsu (mengatur InnerCoverage bit ketika piksel tidak sepenuhnya tercakup untuk setiap kesalahan snapping pada resolusi yang lebih besar dari atau sama dengan resolusi di mana Draw saat ini beroperasi), tetapi negatif palsu diizinkan. Singkatnya, implementasi tidak boleh salah mengidentifikasi piksel sebagai sepenuhnya tercakup yang tidak akan dengan koordinat puncak titik mengambang penuh di Rasterizer.

Piksel yang akan sepenuhnya tercakup jika perangkat keras menggunakan koordinat puncak titik float penuh hanya dapat dihilangkan jika mereka berpotongan di wilayah ketidakpastian dalam, yang tidak boleh lebih besar dari ukuran kisi sub-piksel, atau 1/256 piksel, di domain titik tetap. Dengan kata lain, piksel sepenuhnya berada dalam batas dalam wilayah ketidakpastian dalam harus ditandai sebagai tercakup sepenuhnya. Batas dalam wilayah ketidakpastian diilustrasikan dalam diagram di bawah ini oleh garis putus-putus hitam tebal. 1/256 berasal dari representasi koordinat Rasterizer titik tetap 16,8, yang dapat berubah jika presisi Rasterizer berubah. Wilayah ketidakpastian ini cukup untuk memperhitungkan kesalahan snapping yang disebabkan oleh konversi koordinat floating point vertex ke koordinat vertex titik tetap di Rasterizer.

Persyaratan wilayah ketidakpastian minimum 1/512 yang sama yang ditentukan dalam interaksi Aturan Rasterisasi juga berlaku di sini.

Diagram berikut mengilustrasikan wilayah ketidakpastian dalam yang valid yang dihasilkan dengan menyapu persegi di sekitar tepi primitif di domain titik tetap (yaitu simpul telah diukur oleh representasi titik tetap 16,8). Dimensi persegi ini didasarkan pada ukuran wilayah ketidakpastian dalam yang valid: untuk 1/256 piksel, persegi adalah 1/128 piksel dalam lebar dan tinggi. Segitiga hijau mewakili primitif tertentu, garis putus-putus hitam tebal mewakili batas wilayah ketidakpastian dalam, kotak hitam padat mewakili persegi yang disapu di sepanjang tepi primitif, dan area kotak-kotak oranye adalah wilayah ketidakpastian dalam:

reqion ketidakpastian dalam.

Penggunaan InnerCoverage tidak memengaruhi apakah piksel dirasterisasi secara konservatif, yaitu menggunakan salah satu mode ini InputCoverage tidak memengaruhi piksel mana yang dirasterisasi ketika mode Rasterisasi Konservatif diaktifkan. Oleh karena itu, ketika InnerCoverage digunakan dan Pixel Shader memproses piksel yang tidak sepenuhnya tercakup oleh geometri nilainya akan menjadi 0, tetapi pemanggilan Pixel Shader akan memiliki sampel yang diperbarui. Ini berbeda dari kapan InputCoverage adalah 0, yang berarti bahwa tidak ada sampel yang akan diperbarui.

Input ini saling eksklusif dengan InputCoverage : keduanya tidak dapat digunakan.

Untuk mengakses InnerCoverage, itu harus dinyatakan sebagai komponen tunggal dari salah satu register input Pixel Shader. Mode interpolasi pada deklarasi harus konstan (interpolasi tidak berlaku).

Bidang InnerCoverage bit tidak dipengaruhi oleh pengujian kedalaman/stensil, juga tidak diANDingi dengan status SampleMask Rasterizer.

Input ini hanya valid dalam mode Rasterisasi Konservatif. Ketika Rasterisasi Konservatif tidak diaktifkan, InnerCoverage menghasilkan nilai yang tidak terdefinisi.

Pemanggilan Pixel Shader yang disebabkan oleh kebutuhan akan Helper Pixels, tetapi sebaliknya tidak tercakup oleh primitif, harus memiliki register yang InnerCoverage diatur ke 0.

Interaksi Interpolasi Atribut

Mode interpolasi atribut tidak berubah dan melanjutkan dengan cara yang sama seperti ketika Rasterisasi Konservatif tidak diaktifkan, di mana simpul yang diskalakan viewport dan dikonversi titik tetap digunakan. Karena semua sampel dalam piksel yang diraster secara konservatif dianggap tercakup, itu valid untuk nilai yang akan diekstrapolasi, mirip dengan ketika mode interpolasi frekuensi piksel digunakan pada RenderTarget dengan jumlah sampel lebih besar dari 1. Mode interpolasi sentroid menghasilkan hasil yang identik dengan mode interpolasi non-sentroid yang sesuai; gagasan sentroid tidak berarti dalam skenario ini - di mana cakupan sampel hanya penuh atau 0.

Rasterisasi Konservatif memungkinkan segitiga degenerasi menghasilkan pemanggilan Pixel Shader, oleh karena itu, segitiga degenerasi harus menggunakan nilai yang ditetapkan ke Vertex 0 untuk semua nilai terinterpolasi.

Mengklip interaksi

Ketika mode Rasterisasi Konservatif diaktifkan dan klip kedalaman dinonaktifkan (ketika DepthClipEnable Rasterizer State diatur ke FALSE), mungkin ada varians dalam interpolasi atribut untuk segmen primitif yang berada di luar rentang 0 <= z <= w, tergantung pada implementasi: nilai konstanta digunakan dari titik di mana intersektif primitif bidang yang relevan (dekat atau jauh), atau interpolasi atribut berperilaku seperti ketika mode Rasterisasi Konservatif dinonaktifkan. Namun, perilaku nilai kedalaman sama terlepas dari mode Rasterisasi Konservatif, yaitu primitif yang berada di luar rentang kedalaman masih harus diberi nilai batas terdekat dari rentang kedalaman viewport. Perilaku interpolasi atribut di dalam rentang 0 <= z <= w harus tetap tidak berubah.

Interaksi Jarak Klip

Jarak Klip valid ketika mode Rasterisasi Konservatif diaktifkan, dan berperilaku untuk piksel yang dirasterisasi secara konservatif seperti yang terjadi ketika Rasterisasi Konservatif tidak diaktifkan dengan semua sampel tercakup.

Perhatikan bahwa Rasterisasi Konservatif dapat menyebabkan ekstrapolasi koordinat puncak W, yang dapat menyebabkan W <= 0. Ini dapat menyebabkan implementasi Jarak Klip per piksel beroperasi pada Jarak Klip yang telah Perspektif Dibagi dengan nilai W yang tidak valid. Implementasi Jarak Klip harus menjaga dari pemanggilan rasterisasi untuk piksel di mana vertex mengoordinasikan W <= 0 (misalnya karena ekstrapolasi ketika dalam mode Rasterisasi Konservatif).

Interaksi Rasterisasi Independen Target

Mode Rasterisasi Konservatif kompatibel dengan Rasterisasi Independen Target (TIR). Aturan dan pembatasan TIR berlaku, berperilaku untuk piksel yang diraster secara konservatif seolah-olah semua sampel tercakup.

Interaksi Topologi Primitif IA

Rasterisasi Konservatif tidak didefinisikan untuk primitif garis atau titik. Oleh karena itu, Topologi Primitif yang menentukan titik atau garis menghasilkan perilaku yang tidak terdefinisi jika diumpankan ke unit rasterizer ketika Rasterisasi Konservatif diaktifkan.

Validasi lapisan debug memverifikasi aplikasi tidak menggunakan Topologi Primitif ini.

Interaksi kueri

Untuk piksel yang diraster secara konservatif, kueri berperilaku seperti saat Rasterisasi Konservatif tidak diaktifkan saat semua sampel tercakup. Misalnya, untuk piksel yang diraster secara konservatif, D3D12_QUERY_TYPE_OCCLUSION dan D3D12_QUERY_TYPE_PIPELINE_STATISTICS (dari D3D12_QUERY_TYPE) harus berperilaku seperti yang mereka lakukan ketika Rasterisasi Konservatif tidak diaktifkan ketika semua sampel dicakup.

Pemanggilan Pixel Shader harus dinaikkan untuk setiap piksel yang dirasterisasi secara konservatif dalam mode Rasterisasi Konservatif.

Interaksi Status Cull

Semua Status Cull valid dalam mode Rasterisasi Konservatif dan mengikuti aturan yang sama seperti ketika Rasterisasi Konservatif tidak diaktifkan.

Saat membandingkan Rasterisasi Konservatif di seluruh resolusi dengan sendirinya atau tanpa Mengaktifkan Rasterisasi Konservatif, ada kemungkinan bahwa beberapa primitif mungkin memiliki wajah yang tidak cocok (yaitu satu menghadap ke belakang, yang menghadap ke depan lainnya). Aplikasi dapat menghindari ketidakpastian ini dengan menggunakan D3D12_CULL_MODE_NONE (dari D3D12_CULL_MODE) dan tidak menggunakan IsFrontFace Nilai yang Dihasilkan Sistem.

Interaksi IsFrontFace

IsFrontFace Nilai Yang Dihasilkan Sistem valid untuk digunakan dalam mode Rasterisasi Konservatif, dan mengikuti perilaku yang ditentukan ketika Rasterisasi Konservatif tidak diaktifkan.

Interaksi Mode Isian

Satu-satunya D3D12_FILL_MODE yang valid untuk Rasterisasi Konservatif adalah D3D12_FILL_SOLID, mode pengisian lainnya adalah parameter yang tidak valid untuk Status Rasterizer.

Ini karena spesifikasi fungsional D3D12 menentukan bahwa mode pengisian bingkai kawat harus mengonversi tepi segitiga menjadi garis dan mengikuti aturan rasterisasi garis dan perilaku rasterisasi garis konservatif belum ditentukan.

Detail implementasi

Jenis rasterisasi yang didukung di Direct3D 12 terkadang disebut sebagai "Rasterisasi Konservatif yang Berlebihan". Ada juga konsep "Rasterisasi Konservatif yang Diremehkan", yang berarti bahwa hanya piksel yang sepenuhnya dicakup oleh primitif yang dirender yang dirasterisasi. Informasi Rasterisasi Konservatif yang diremehkan tersedia melalui shader piksel melalui penggunaan data cakupan input, dan hanya Rasterisasi Konservatif yang terlalu diestimasi yang tersedia sebagai mode rasterisasi.

Jika ada bagian primitif yang tumpang tindih dengan piksel, piksel tersebut dianggap tertutup dan kemudian dirasterisasi. Saat tepi atau sudut primitif jatuh di sepanjang tepi atau sudut piksel, penerapan "aturan kiri atas" bersifat khusus implementasi. Namun, untuk implementasi yang mendukung segitiga degenerasi, segitiga degenerasi di sepanjang tepi atau sudut harus mencakup setidaknya satu piksel.

Implementasi Rasterisasi Konservatif dapat bervariasi pada perangkat keras yang berbeda, dan menghasilkan positif palsu, yang berarti bahwa mereka dapat salah memutuskan bahwa piksel tercakup. Ini dapat terjadi karena detail khusus implementasi seperti kesalahan pertumbuhan primitif atau snapping yang melekat dalam koordinat puncak titik tetap yang digunakan dalam rasterisasi. Alasan positif palsu (sehubungan dengan koordinat puncak titik tetap) valid adalah karena beberapa jumlah positif palsu diperlukan untuk memungkinkan implementasi untuk melakukan evaluasi cakupan terhadap simpul pasca-snaped (yaitu koordinat puncak yang telah dikonversi dari titik mengambang ke 16,8 titik tetap yang digunakan dalam rasterizer), tetapi menghormati cakupan yang dihasilkan oleh koordinat vertex titik mengambang asli.

Implementasi Rasterisasi konservatif tidak menghasilkan negatif palsu sehubungan dengan koordinat puncak floating-point untuk primitif pasca-snap non-degenerasi: jika ada bagian dari primitif yang tumpang tindih dengan bagian mana pun dari piksel, piksel tersebut dirasterisasi.

Segitiga yang berdegenerasi (indeks duplikat dalam buffer indeks atau collinear dalam 3D), atau menjadi degenerasi setelah konversi titik tetap (simpul collinear di rasterizer), mungkin atau mungkin tidak dimusnahkan; keduanya adalah perilaku yang valid. Segitiga degenerasi harus dianggap menghadap kembali, jadi jika perilaku tertentu diperlukan oleh aplikasi, segitiga dapat menggunakan culling back-face atau pengujian untuk menghadap ke depan. Degenerasi segitiga menggunakan nilai yang ditetapkan ke Vertex 0 untuk semua nilai terinterpolasi.

Ada tiga tingkat dukungan perangkat keras, selain kemungkinan perangkat keras tidak mendukung fitur ini.

  • Tingkat 1 memberlakukan wilayah ketidakpastian maksimum 1/2 piksel dan tidak mendukung degenerasi pasca-snap. Ini bagus untuk penyajian ubin, atlas tekstur, pembuatan peta cahaya, dan peta bayangan sub-piksel.
  • Tingkat 2 mengurangi wilayah ketidakpastian maksimum menjadi 1/256 dan memerlukan degenerasi pasca-snap tidak dimusnahkan. Tingkat ini berguna untuk akselerasi algoritma berbasis CPU (seperti voxelization).
  • Tingkat 3 mempertahankan wilayah ketidakpastian maksimum 1/256 dan menambahkan dukungan untuk cakupan input dalam. Cakupan input dalam menambahkan nilai SV_InnerCoverage baru ke High Level Shading Language (HLSL). Ini adalah bilangan bulat skalar 32-bit yang dapat ditentukan pada input ke shader piksel, dan mewakili informasi Rasterisasi Konservatif yang diremehkan (yaitu, apakah piksel dijamin sepenuhnya tercakup). Tingkat ini sangat membantu untuk oklusi culling.

Ringkasan API

Metode, struktur, enum, dan kelas pembantu berikut mereferensikan Rasterisasi Konservatif:

Tutorial video pembelajaran lanjutan DirectX : Rasterisasi Konservatif

Tampilan Yang Diurutkan Rasterizer

Merender