Dimungkinkan untuk mengimplementasikan fragmen shader untuk melakukan one-pass gaussian blur? Saya telah menemukan banyak implementasi blur dua jalur (gaussian dan box blur):
- http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html
- http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/
- http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/
dan seterusnya.
Saya telah berpikir untuk mengimplementasikan gaussian blur sebagai konvolusi (pada kenyataannya, ini adalah konvolusi, contoh-contoh di atas hanyalah perkiraan):
glsl
fragment-shader
blur
martin pilch
sumber
sumber
Trik untuk kabur Gaussian cepat dengan GLSL adalah untuk mengambil keuntungan dari kenyataan bahwa GPU menyediakan interpolasi linier dalam perangkat keras. Oleh karena itu, Anda dapat secara efektif mencicipi empat piksel 2D dengan satu prefetch atau delapan voxels 3D. Dengan memutuskan tempat sampel Anda dapat menimbang hasilnya. Referensi definitif adalah Sigg dan Hadwiger's "Fast-Order Texture Filtering" yang dapat Anda temukan online.
Untuk penjelasan yang mudah dibaca, temukan halaman web "Efficient Gaussian blur with linear sampling". Sebagaimana dicatat, karena blur Gaussian dapat dipisahkan dengan kernel yang luas, maka paling efisien untuk melakukan satu lintasan per dimensi.
Namun, Anda juga dapat menggunakan trik ini untuk memperkirakan Gaussian dengan kernel yang ketat dalam sekali operan. Pada contoh di bawah ini saya mengemulasi kernel 3D dengan slice atas = [1 2 1; 2 4 2; 1 2 1]; slice tengah = [2 4 2; 4 8 4; 2 4 2]; irisan bawah = [1 2 1; 2 4 2; 1 2 1]. Dengan mengambil sampel +/- 0,5 voxels di setiap dimensi Anda melakukan ini hanya dengan 8 tekstur mengambil daripada 27. Saya mendemonstrasikan ini dalam GLSL sebagai file shader MRIcroGL - cukup simpan save script di bawah ini sebagai "a.txt" dan letakkan di dalam Folder "Shader" MRIcroGL. Ketika Anda meluncurkan kembali program ini, Anda akan melihat gambar ray cast Anda kabur. Mengklik kotak centang "doBlur" mengaktifkan dan menonaktifkan pengaburan. Menggunakan Intel GPU terintegrasi saya di laptop saya dan "chris_t1" gambar yang datang dengan MRIcroGL saya mendapatkan 70fps tanpa kabur (1 fetch tekstur) dan 21fps dengan blurring (8 fetches). Sebagian besar kode hanyalah ray caster klasik, "doBlur" bersyarat merangkum pertanyaan Anda.
//-------a.txt mengikuti
sumber