Bagaimana cara menghitung cakupan kurva analitik yang tumpang tindih secara akurat?

10

Antialiasing bentuk 2D bermuara pada komputasi fraksi piksel yang ditutupi oleh bentuk. Untuk bentuk non-tumpang tindih yang sederhana, ini tidak terlalu sulit: klip bentuk terhadap persegi pixel dan hitung luas bentuk yang dihasilkan. Tetapi menjadi lebih sulit jika beberapa bentuk tumpang tindih dengan piksel yang sama. Cukup dengan menjumlahkan area dapat menyebabkan cakupan yang dihitung terlalu tinggi, jika mengabaikan jumlah yang satu bentuk menutupi bentuk lainnya. Misalnya, lihat bagian Keterbatasan artikel ini tentang rendering font . Anda mungkin juga berada dalam situasi di mana dua kurva berasal dari objek yang berbeda dengan warna yang berbeda (jadi ini bukan tentang cakupan total untuk penyatuan dua bentuk, tetapi cakupan masing-masing secara terpisah).

Bagaimana ini akan dihitung jika Anda peduli dengan akurasi lengkap? Lebih rumit lagi, bagaimana Anda menghitung cakupan secara akurat untuk bentuk non-poligon seperti kurva yang tumpang tindih? Apakah ada titik ketika Anda tidak punya pilihan selain kembali ke teknik multisampling atau stochastic?

John Calsbeek
sumber

Jawaban:

10

Sebenarnya tidak ada cara yang baik untuk melakukan ini secara analitik secara efisien untuk semua kasus sudut. Sebagian besar atau semua penyaji 2D komersial yang berupaya melakukan perhitungan cakupan analitik membuat kesalahan yang dapat diprediksi bahwa metode multisampling tidak.

Masalah umum adalah dua bentuk yang tumpang tindih yang memiliki tepi yang sama. Situasi umum adalah bahwa saluran alfa meringkas hingga batas alfa yang terlalu tebal sehingga sedikit alias. Atau jika bentuk diwarnai berbeda, sistem bingung warna apa latar belakangnya. Ini sangat menjengkelkan.

gambar

Gambar 1 : Mesin rendering membingungkan cakupan dan membuat garis putih tipis di mana tidak ada garis besar seharusnya.

Jumlah cakupan sempurna kedua untuk pemfilteran kotak. Kita tentu bisa berbuat lebih baik. Mempertimbangkan bahwa ada begitu banyak kasus sudut khusus yang membutuhkan operasi boolean pada bentuk untuk melakukan yang benar, super sampling masih unggul. Bahkan perkiraan cakupan dapat digunakan untuk memusatkan pengambilan sampel di tempat yang paling mungkin dibutuhkan.

Situasi ini dapat disederhanakan menjadi poligon pada tingkat sub-pixel sehingga solusi analitis diskrit dapat diselesaikan. Tetapi ini dengan mengorbankan fleksibilitas. Misalnya itu tidak keluar dari pertanyaan bahwa sistem vektor masa depan mungkin ingin memungkinkan garis kabur lebar variabel yang menimbulkan masalah untuk solusi analitik, seperti halnya benda berwarna bervariasi lainnya.

Cara melakukannya secara analitis

Adegan analitik

Gambar 2 : Misalkan Anda memiliki pemandangan ini, pemandangan meledak di sebelah kanan

Sekarang Anda tidak bisa hanya melakukan ini secara analitis, masing-masing bagian secara terpisah dan kemudian menggabungkan data. Karena itu menghasilkan data yang salah. Lihat alpha blending akan membiarkan biru bersinar melalui celah jika Anda melakukannya.

Yang harus Anda lakukan adalah membagi pemandangan sehingga setiap bentuk menghilangkan apa yang ada di bawah yang lain:

masukkan deskripsi gambar di sini

Gambar 3 : Anda perlu memotong permukaan yang mendasarinya.

Sekarang jika semuanya buram maka ini semua lurus ke depan. cukup hitung luas masing-masing bagian dan gandakan dengan warna dan jumlahkan semuanya. Sekarang Anda dapat menggunakan sesuatu seperti ini .

Ini semua rusak jika bentuk individual Anda tidak buram tentu saja tetapi bahkan itu dapat dilakukan pada tingkat tertentu.

Ingat:

  • Perhitungan AA perlu dilakukan dalam ruang warna linier, dan dikonversi kembali untuk menggunakan ruang.
joojaa
sumber
Katakan bahwa kita tidak terlalu peduli dengan efisiensi. Bagaimana kita melakukan perhitungan cakupan untuk operasi boolean pada bentuk? Apakah itu mungkin secara umum, atau hanya untuk bentuk tertentu?
John Calsbeek
@JohnCalsbeek ok im mulai membangun jawaban analitik, itu akan memakan waktu cukup lama
joojaa