Direct3D 11.3 Rasterisasi Konservatif

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 diraster, 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, pemusnahan oklusi, dan deteksi visibilitas.

Misalnya, gambar berikut menunjukkan segitiga hijau yang dirender menggunakan rasterisasi konservatif. Area coklat dikenal sebagai "wilayah ketidakpastian" - wilayah di mana kesalahan pembulatan dan masalah lainnya menambahkan beberapa ketidakpastian ke dimensi segitiga yang tepat. Segitiga merah di setiap puncak menunjukkan bagaimana wilayah ketidakpastian dihitung. 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.

memperlihatkan aturan kiri atas

Interaksi dengan alur

Untuk banyak detail tentang bagaimana rasterisasi konservatif berinteraksi dengan alur grafis, lihat rasterisasi Konservatif D3D12.

Detail implementasi

Jenis rasterisasi yang didukung di Direct3D 12 terkadang disebut sebagai "rasterisasi konservatif yang terlalu 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 mendukung wilayah ketidakpastian 1/2 piksel, dan tidak ada degenerasi pasca-snap. Ini bagus untuk penyajian ubin, atlas tekstur, pembuatan peta cahaya, dan peta bayangan sub-piksel.
  • Tingkat 2 menambahkan degenerasi pasca-snap, dan wilayah ketidakpastian 1/256. Ini juga menambahkan dukungan untuk akselerasi algoritma berbasis CPU (seperti voxelization).
  • Tingkat 3 menambahkan 1/512 wilayah ketidakpastian, cakupan input dalam dan mendukung pemusnahan oklusi. Cakupan input 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).

Ringkasan API

Metode, struktur, enum, dan kelas pembantu berikut mereferensikan rasterisasi konservatif: