Mengapa menggunakan filter tenda di penelusuran jalur?

12

99 baris pelacak jalur C Smallpt membuat kisi subpiksel 2x2 untuk setiap piksel yang akan direndernya dan kemudian melakukan filter tenda untuk menggabungkannya.

Ada presentasi yang menarik menjelaskan kode di sini , dan itu menyebutkan filter tenda tetapi tidak menjelaskan mengapa ada di sana.

Adakah yang bisa menjelaskan mengapa filter tenda lebih disukai dalam hal ini daripada kotak blur (hanya rata-rata sampel)?

Apakah kualitasnya lebih tinggi jika menggunakan filter tenda, seperti interpolasi bicubic hermite?

Alan Wolfe
sumber

Jawaban:

13

Filter antialiasing ideal teoretis untuk data sampel yang diambil secara terpisah adalah filter tulus , karena filter ini dengan sempurna menghapus semua frekuensi yang lebih tinggi dari frekuensi Nyquist, sementara menyisakan semua yang lebih rendah. Jadi, sampai batas tertentu, kita dapat mengharapkan filter antialiasing yang lebih mirip dengan filter sinc untuk menghasilkan gambar berkualitas lebih baik.

Filter tenda (filter segitiga) tentu menyerupai puncak pusat dari filter sinc lebih dekat daripada filter kotak:

filter sinc, segitiga, dan kotak

Filter bikubik (mis. Mitchell-Netravali) dapat menangkap bentuk sinc dengan lebih tepat, termasuk dua lobus negatif pertamanya.

Realitas pemilihan filter sedikit lebih halus daripada "perkiraan sinc sebaik mungkin", karena ada berbagai jenis artefak yang dapat dihasilkan oleh filter antialiasing "non-ideal", seperti aliasing, overblurring, dan dering. Selain itu, filter yang berbeda mungkin lebih atau kurang mahal secara komputasi. Jadi ini adalah permainan mencoba menukar artefak yang berbeda satu sama lain dan melawan kinerja. Adegan yang berbeda / gambar dapat mendukung satu pilihan atau yang lain, dan itu juga sebagian penilaian estetika.

Adapun mengapa smallpt menggunakan filter tenda pada khususnya, saya kira untuk kombinasi kinerja (ini adalah filter cepat untuk mengevaluasi) dan singkatnya - itu dapat dilakukan dalam beberapa baris kode, sementara filter bikubik akan membutuhkan lebih banyak kode.

Kebetulan, smallpt benar-benar menggunakan kotak subpixel 2x2 dan menempatkan filter tenda di setiap subpixel , kemudian rata-rata bersama-sama hasil dari empat subpixel. Jadi efek keseluruhannya adalah, anehnya, dari jumlah empat tenda, yang akhirnya tampak seperti piramida dengan puncak datar:

filter tenda subpixel

Saya tidak yakin apakah ini disengaja, atau kebetulan seperti itu caranya. Dugaan saya adalah ini menghasilkan gambar yang agak lebih tajam daripada jika filter tenda tunggal per piksel digunakan (karena dukungan yang lebih sempit), tetapi mungkin juga lebih terlihat alias.

Nathan Reed
sumber
Saya tidak bisa tidak mengucapkan terima kasih! Sebenarnya, saya pertama kali memahami ini sebagai pengambilan sampel bertingkat dengan 4 strata. Dan saya membuat jumlah "strata" dapat disesuaikan, seperti 9, 16 ... Sekarang, saya tahu itu adalah filter "trapesium" (tidak begitu umum di renderers lain). Dan karena jumlah "strata" saya cenderung tak terbatas, filter menjadi filter kotak, tempat saya mengecat bunga bakung ... Menarik!
chaosink
3

Saya hanya melihat artikel Wikipedia tentang interpolasi Bilinear. Filter tenda adalah semacam interpolasi Bilinear. Interpolasi Bilinear diinterpolasi pada 2 dimensi. Pertama-tama secara linear diinterpolasi pada satu dimensi dan kemudian yang lain.

masukkan deskripsi gambar di sini

Ketika Anda melihat gambar ini, pertama-tama melakukannya pada kolom dan kemudian pada baris misalnya.

Alasan mengapa ini bisa lebih baik daripada warna rata-rata, adalah bahwa ketika salah satu poin lebih dekat ke pusat daripada yang lain, itu berkontribusi lebih banyak ke warna akhir. Dengan rata-rata warna, semua poin berkontribusi sama, bahkan ketika satu titik lebih dekat ke tengah daripada titik lainnya.

Jika semua 4 poin berada pada posisi tetap pada jarak yang sama dari pusat, maka Anda mendapatkan kontribusi 25% tepat pada semua poin, itu sama dengan rata-rata.

Ini berarti bahwa ketika Anda menerapkan anti-aliasing hanya dengan merender pada resolusi 4 kali lebih tinggi, dan kemudian mengambil sampel itu. Output antara 2 cara harus sama, sejauh yang saya mengerti.

Jadi, filter mana yang harus Anda gunakan? Yah, itu tergantung pada apa yang Anda inginkan dan situasi Anda. Jika Anda memilih lokasi sub-piksel acak untuk sampel Anda, maka mungkin lebih baik menggunakan interpolasi Bilinear. Jika semua poin sudah diperbaiki dan Anda hanya membuat resolusi yang lebih tinggi, maka rata-rata bisa berguna. Pada akhirnya ini semua hanya beberapa hal sub-pixel yang biasanya Anda tidak atau hampir tidak memperhatikan, jadi jika ada semacam AA, maka itu cukup baik. Tapi itu hanya pendapat saya dan mungkin itu dari penampil rata-rata animasi 3D atau sesuatu seperti itu.

Interpolasi Bicubic memberi Anda tampilan yang lebih halus. Bicubic: masukkan deskripsi gambar di sini

Bilinear: masukkan deskripsi gambar di sini

Mana yang lebih baik? Yah, itu tergantung pada apa yang Anda suka, dan saya tidak berpikir bahwa akan ada perbedaan besar.

Sumber saya: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

https://en.wikipedia.org/wiki/Bilinear_interpolation

https://en.wikipedia.org/wiki/Bicubic_interpolation

(Gambar berasal dari Wikipedia dan merupakan domain publik)

Saya harap ini membantu, saya hanya ingin mengatakan bahwa saya bukan seorang profesional dalam hal ini, saya hanya seseorang yang suka hal-hal grafis komputer. Bisa jadi saya membuat beberapa kesalahan. Jika demikian, katakan saja dan saya ubah!

bram0101
sumber