Bagaimana cara menerapkan anti-aliasing di OpenGL?

28

Saya ingin melakukan anti-aliasing layar penuh di OpenGL, dan tidak ingin menggunakan anti-aliasing yang disediakan oleh OpenGL sendiri, karena saya membangun game dan menginginkan efek yang baik di dalamnya.

bagaimana saya harus melanjutkan?

orang bodoh
sumber
Dengan "anti-aliasing yang disediakan oleh GL sendiri", apakah Anda merujuk pada petunjuk garis dan poligon kualitas lama yang tidak disebutkan namanya yang dilabeli sebagai "antialiasing", atau apakah Anda merujuk menggunakan MSAA biasa melalui visual GLX / WGL?
Lars Viklund

Jawaban:

28

Ada beberapa alternatif untuk MSAA asli di OpenGL. Dengan efek post-processing, hal terbaik tentang mereka adalah bahwa Anda biasanya bisa melempar shader ke gambar akhir yang belum diproses dan melakukan sisanya. Berikut adalah tiga metode yang patut dilihat:

  • Perkiraan Cepat Anti-Aliasing (Geeks3D) - Bagus dalam banyak kasus. Cukup mudah diterapkan dan dipahami. Kekurangannya tajam, noise kontras tinggi dalam tekstur sedikit kabur. Tepi sehalus 1/4 piksel curam terlihat mati-akurat seperti MSAA tradisional. Kurang curam dari itu, ia kehilangan sedikit akurasi.

  • Normal Filtered Anti-Aliasing (GameDev ) - Belum menguji yang ini secara akurat, tapi ini yang paling mudah dipahami. Dalam kasus terbaik menyerupai 16x MSAA dan dalam kasus terburuk itu seperti 2x MSAA. Ini menghasilkan peta normal sementara untuk mewakili tepi dan sudut relatif. Anda dapat mencicipi peta normal baik dengan perbedaan luma atau perbedaan warna.

  • Morphological Anti-Aliasing (Iryoku) - telah ditingkatkan menjadi SMAA - Subpixel Mophological AA. Ini cukup rumit pada 4 operan, tetapi mencapai hasil terbaik yang pernah saya lihat. Ini menciptakan gradien di sepanjang tepi setahap 1/100 hingga 1/200 piksel curam (!). Pengambilan sampel dapat berbasis luma, berbasis warna atau berbasis kedalaman. Teksturnya tetap segar dan bersih. (contohnya adalah berbasis DX10 dan HLSL, akan membutuhkan waktu untuk port ke GLSL secara akurat)

Teknik-teknik ini tidak super-sampel atau multi-sampel, sehingga garis yang muncul dengan ketebalan kurang dari 1 piksel akan muncul dengan celah dan tidak anti-alias dengan benar. Ini adalah kelemahan menggunakan pendekatan non-MSAA. Karena Anda hanya bekerja dengan gambar raster pada resolusi penuh, Anda tidak dapat membuat informasi tambahan dari celah kosong ini.

Perhatikan bahwa semua teknik ini bergantung pada pengambilan sampel nilai luma (kecerahan) atau kroma (warna) yang berdekatan. Menghitung luma dan koreksi gamma opsional membutuhkan instruksi tambahan pada AA shader, meskipun cukup mudah. Anda dapat membongkar ini dengan menghitung luma di shader sebelumnya yang menyediakan gambar yang tidak disentuh, menyimpan luma di saluran alpha. Kemudian di AA shader, Anda hanya akan mencicipi alpha.

ChrisC
sumber
7

Ada banyak cara untuk melakukan antialiasing. Salah satunya adalah menggunakan multisample antialiasing (MSAA), di mana buffer belakang Anda benar-benar menyimpan beberapa sampel sub-pixel, dan ketika Anda membuat segitiga, garis, dll. Sistem secara otomatis mengisi set sampel yang benar di setiap piksel. Kemudian pada akhir rendering gambar "diselesaikan" dengan rata-rata atas semua sampel sub-pixel untuk mendapatkan satu sampel per piksel.

Cara lain adalah dengan menggunakan antialiasing pasca-pemrosesan, di mana Anda membuat adegan seperti biasa dan kemudian melakukan beberapa pengaburan yang ditargetkan pada hasil akhir untuk menyembunyikan tepi alias. Ada berbagai teknik untuk ini, tetapi salah satu yang terbaik / paling populer saat ini disebut FXAA (Fast approXimate Anti-Aliasing).

MSAA umumnya akan memberikan hasil yang terlihat lebih baik daripada AA pasca-pemrosesan, tetapi dapat lebih lambat karena membutuhkan sekitar dua kali lipat bandwidth memori untuk setiap operasi rendering. MSAA juga dapat membutuhkan lebih banyak memori video daripada AA pasca-pemrosesan, tergantung pada detail pengaturan.

Anda dapat menemukan info spesifik tentang penerapan MSAA atau FXAA di Web - cukup google salah satu dari persyaratan tersebut.

Nathan Reed
sumber
2

Apakah Anda bersedia membuat kode shader GLSL Anda sendiri? Jika demikian, periksa tutorial ini .

Dan
sumber
baik saya ingin melakukannya dengan menggunakan shader karena saya menggunakan shader untuk efek lain juga. Bisakah Anda memberikan beberapa tautan lain untuk shader juga
noddy