Aturan rasterisasi

Aturan rasterisasi menentukan bagaimana data vektor dipetakan ke dalam data raster. Data raster diposisikan ke lokasi bilangan bulat yang kemudian dimusnahkan dan diklip (untuk menggambar jumlah piksel minimum), dan atribut per piksel diinterpolasi (dari atribut per vertex) sebelum diteruskan ke shader piksel.

Ada beberapa jenis aturan, yang bergantung pada jenis primitif yang sedang dipetakan, serta apakah data menggunakan multisampling atau tidak untuk mengurangi alias. Ilustrasi berikut menunjukkan bagaimana kasus sudut ditangani.

Aturan Rasterisasi Segitiga (Tanpa Multisampling)

Setiap pusat piksel yang berada di dalam segitiga digambar; piksel diasumsikan berada di dalam jika melewati aturan kiri atas. Aturan kiri atas adalah bahwa pusat piksel didefinisikan untuk berbaring di dalam segitiga jika terletak di tepi atas atau tepi kiri segitiga.

di mana:

  • Tepi atas, adalah tepi yang persis horizontal dan berada di atas tepi lainnya.
  • Tepi kiri, adalah tepi yang tidak benar-benar horizontal dan berada di sisi kiri segitiga Segitiga A dapat memiliki satu atau dua tepi kiri.

Aturan kiri atas memastikan bahwa segitiga yang berdampingan digambar sekali.

Ilustrasi ini menunjukkan contoh piksel yang digambar karena terletak di dalam segitiga atau mengikuti aturan kiri atas.

examples of top-left triangle rasterization

Penutup piksel berwarna abu-abu terang dan gelap menunjukkannya sebagai grup piksel untuk menunjukkan segitiga mana mereka berada di dalamnya.

Aturan Rasterisasi Garis (Alias, Tanpa Multisampling)

Aturan rasterisasi garis menggunakan area pengujian berlian untuk menentukan apakah garis mencakup piksel. Untuk garis x-mayor (garis dengan -1 <= kemiringan <= +1), area uji berlian mencakup (ditunjukkan padat) tepi kiri bawah, tepi kanan bawah, dan sudut bawah; berlian mengecualikan (ditampilkan titik-titik) tepi kiri atas, tepi kanan atas, korder atas, sudut kiri, dan sudut kanan. Garis y-mayor adalah garis apa pun yang bukan garis x-mayor; area berlian uji sama seperti yang dijelaskan untuk garis x-mayor kecuali sudut kanan juga disertakan.

Mengingat area berlian, garis mencakup piksel jika garis keluar dari area uji berlian piksel saat berjalan di sepanjang garis dari awal menuju akhir. Garis garis bersifat sama, karena digambar sebagai urutan garis.

Ilustrasi berikut ini memperlihatkan beberapa contoh.

examples of aliased line rasterization

Aturan Rasterisasi Garis (Antialias, Tanpa Multisampling)

Garis antialias dirasterisasi seolah-olah itu persegi panjang (dengan lebar = 1). Persegi berpotongan dengan target render yang menghasilkan nilai cakupan per piksel, yang dikalikan menjadi komponen alfa output shader piksel. Tidak ada antialias yang telah diformat sebelumnya saat menggambar garis pada target render multisampel.

Dianggap bahwa tidak ada satu pun cara "terbaik" untuk melakukan penyajian garis antialisis. Direct3D mengadopsi sebagai pedoman metode yang ditunjukkan dalam ilustrasi berikut. Metode ini diturunkan secara empirik, menunjukkan sejumlah properti visual yang dianggap diinginkan.

Perangkat keras tidak perlu sama persis dengan algoritma ini; pengujian terhadap referensi ini harus memiliki toleransi "wajar", dipandu oleh beberapa prinsip yang tercantum lebih lanjut di bawah ini, memungkinkan berbagai implementasi perangkat keras dan ukuran kernel filter. Namun, fleksibilitas ini tidak diizinkan dalam implementasi perangkat keras, dapat dikomunikasikan melalui Direct3D ke aplikasi, selain hanya menggambar garis dan mengamati/mengukur tampilannya.

examples of antialiased line rasterization

Algoritma ini menghasilkan garis yang relatif halus, dengan intensitas seragam, dengan tepi bergerigi minimal atau mengepang. Pola Moire untuk garis tutup diminimalkan. Ada cakupan yang baik untuk persimpangan antara segmen garis yang ditempatkan secara end-to-end.

Kernel filter adalah tradeoff yang wajar antara jumlah edge blurring dan perubahan intensitas yang disebabkan oleh koreksi gamma. Nilai cakupan dikalikan menjadi piksel shader o0.a (srcAlpha) per rumus berikut dengan tahap Output Merger (OM):

srcColor * srcAlpha + destColor * (1-srcAlpha)

Aturan Rasterisasi Titik (Tanpa Multisampling)

Titik ditafsirkan seolah-olah terdiri dari dua segitiga dalam pola Z, yang menggunakan aturan rasterisasi segitiga. Koordinat mengidentifikasi bagian tengah persegi lebar satu piksel. Tidak ada pemusnahan untuk poin.

Ilustrasi berikut ini memperlihatkan beberapa contoh.

examples of point rasterization

Aturan Rasterisasi Anti-Aliasing Multisample

Antialias multisample (MSAA) mengurangi alias geometri menggunakan cakupan piksel dan pengujian stensil kedalaman di beberapa lokasi sub-sampel. Untuk meningkatkan performa, penghitungan per piksel dilakukan sekali untuk setiap piksel yang tercakup, dengan berbagi output shader di seluruh sub-piksel yang tercakup. Antialias multisample tidak mengurangi alias permukaan. Lokasi sampel dan fungsi rekonstruksi tergantung pada implementasi perangkat keras.

Ilustrasi berikut ini memperlihatkan beberapa contoh.

examples of multisample antialias rasterization

Jumlah lokasi sampel tergantung pada mode multisample. Atribut vertex diinterpolasi di pusat piksel, karena di sinilah shader piksel dipanggil (ini menjadi ekstrapolasi jika pusat tidak tercakup). Atribut dapat ditandai dalam shader piksel menjadi sampel sentroid, yang menyebabkan piksel yang tidak tercakup menginterpolasi atribut di persimpangan area piksel dan primitif.

Shader piksel berjalan untuk setiap area piksel 2x2 untuk mendukung perhitungan derivatif (yang menggunakan delta x dan y). Ini berarti bahwa pemanggilan shader terjadi lebih dari yang ditunjukkan untuk mengisi kuanta minimum 2x2 (yang independen dari multisampling). Hasil shader ditulis untuk setiap sampel tercakup yang lulus uji stensil kedalaman per sampel.

Aturan rasterisasi untuk primitif, secara umum, tidak berubah oleh antialias multisample, kecuali:

  • Untuk segitiga, pengujian cakupan dilakukan untuk setiap lokasi sampel (bukan untuk pusat piksel). Jika lebih dari satu lokasi sampel tercakup, shader piksel berjalan sekali dengan atribut yang diinterpolasi di pusat piksel. Hasilnya disimpan (direplikasi) untuk setiap lokasi sampel yang tercakup dalam piksel yang lulus uji kedalaman/stensil.

    Garis diperlakukan sebagai persegi panjang yang terdiri dari dua segitiga, dengan lebar garis 1,4.

  • Untuk titik, pengujian cakupan dilakukan untuk setiap lokasi sampel (bukan untuk pusat piksel).

Format multisampling dapat digunakan dalam target render yang dapat dibaca kembali ke shader menggunakan beban, karena tidak ada penyelesaian yang diperlukan untuk sampel individual yang diakses oleh shader. Format kedalaman tidak didukung untuk sumber daya multisample, oleh karena itu, format kedalaman dibatasi untuk merender target saja.

Format tanpa jenis mendukung multisampling untuk memungkinkan tampilan sumber daya menginterpretasikan data dengan cara yang berbeda. Misalnya, Anda dapat membuat sumber daya multisample menggunakan R8G8B8A8_TYPELESS, merendernya menggunakan sumber daya tampilan target render dengan format R8G8B8A8_UINT, lalu menyelesaikan konten ke sumber daya lain dengan format data R8G8B8A8_UNORM.

Dukungan Perangkat Keras

API melaporkan dukungan perangkat keras untuk multisampling melalui jumlah tingkat kualitas. Misalnya, tingkat kualitas 0 berarti perangkat keras tidak mendukung multisampling (pada format dan tingkat kualitas tertentu). 3 untuk tingkat kualitas berarti bahwa perangkat keras mendukung tiga tata letak sampel yang berbeda dan/atau menyelesaikan algoritma. Anda juga dapat mengasumsikan hal-hal berikut:

  • Format apa pun yang mendukung multisampling, mendukung jumlah tingkat kualitas yang sama untuk setiap format dalam keluarga tersebut.
  • Setiap format yang mendukung multisampling, dan memiliki format _UNORM, _SRGB, _SNORM, atau _FLOAT, juga mendukung penyelesaian.

Pengambilan Sampel Sentroid Atribut saat Antialias Multisample

Secara default, atribut vertex diinterpolasi ke pusat piksel selama antialias multisample; jika pusat piksel tidak tercakup, atribut diekstrapolasi ke pusat piksel. Jika input shader piksel yang berisi semantik sentroid (dengan asumsi piksel tidak sepenuhnya tercakup) akan diambil sampelnya di suatu tempat dalam area piksel yang tercakup, mungkin di salah satu lokasi sampel yang tercakup. Masker sampel (ditentukan oleh status rasterizer) diterapkan sebelum komputasi sentroid. Oleh karena itu, sampel yang ditutupi tidak akan digunakan sebagai lokasi sentroid.

Rasterizer referensi memilih lokasi sampel untuk pengambilan sampel sentroid yang mirip dengan ini:

  • Masker sampel memungkinkan semua sampel. Gunakan pusat piksel jika piksel dicakup atau jika tidak ada sampel yang tercakup. Jika tidak, sampel pertama yang dicakup dipilih, mulai dari pusat piksel dan bergerak ke luar.
  • Masker sampel menonaktifkan semua sampel tetapi satu (skenario umum). Aplikasi dapat menerapkan supersampling multipass dengan bersepeda melalui nilai masker sampel bit tunggal dan merender ulang adegan untuk setiap sampel menggunakan pengambilan sampel sentroid. Ini akan mengharuskan aplikasi menyesuaikan turunan untuk memilih mips tekstur yang lebih rinci dengan tepat untuk kepadatan pengambilan sampel tekstur yang lebih tinggi.

Perhitungan Turunan Saat Multisampling

Shader piksel selalu berjalan menggunakan area minimum 2x2 piksel untuk mendukung perhitungan turunan, yang dihitung dengan mengambil delta di antara data dari piksel yang berdekatan (membuat asumsi bahwa data di setiap piksel telah diambil sampelnya dengan penspasian unit secara horizontal atau vertikal). Ini tidak terpengaruh oleh multisampling.

Jika turunan diminta pada atribut yang telah diambil sampel sentroidnya, perhitungan perangkat keras tidak disesuaikan, yang dapat menyebabkan turunan yang tidak akurat. Shader akan mengharapkan vektor unit di ruang target render tetapi mungkin mendapatkan vektor non-unit sehubungan dengan beberapa ruang vektor lainnya. Oleh karena itu, adalah tanggung jawab aplikasi untuk menunjukkan kewaspadaan ketika meminta turunan dari atribut yang diambil sampel sentroidnya.

Bahkan, disarankan agar Anda tidak menggabungkan turunan dan pengambilan sampel sentroid. Pengambilan sampel sentroid dapat berguna untuk situasi di mana sangat penting bahwa atribut terinterpolasi primitif tidak diekstrapolasi, tetapi ini dilengkapi dengan tradeoff seperti atribut yang tampaknya melompat di mana tepi primitif melintasi piksel (daripada berubah terus menerus) atau turunan yang tidak dapat digunakan oleh operasi pengambilan sampel tekstur yang memperoleh LOD.

Lampiran-lampiran

Tahap rasterizer (RS)