Il est possible d'implémenter un fragment shader pour faire un flou gaussien en une passe? J'ai trouvé beaucoup d'implémentation de flou à deux passes (gaussien et flou de boîte):
- 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/
etc.
J'ai pensé à implémenter le flou gaussien comme convolution (en fait, c'est la convolution, les exemples ci-dessus ne sont que des approximations):
glsl
fragment-shader
blur
martin pilch
la source
la source
L'astuce pour un flou gaussien rapide avec GLSL est de tirer parti du fait que le GPU fournit une interpolation linéaire dans le matériel. Par conséquent, vous pouvez effectivement échantillonner quatre pixels 2D avec une seule prélecture ou huit voxels 3D. En décidant où échantillonner, vous pouvez pondérer la sortie. La référence définitive est le "Filtrage rapide des textures du troisième ordre" de Sigg et Hadwiger que vous pouvez trouver en ligne.
Pour une explication lisible, consultez la page Web "Flou gaussien efficace avec échantillonnage linéaire". Comme indiqué, comme le flou gaussien est séparable avec des noyaux larges, il est plus efficace de faire un passage par dimension.
Cependant, vous pouvez également utiliser cette astuce pour approximer une gaussienne avec un noyau serré en une seule passe. Dans l'exemple ci-dessous, j'émule le noyau 3D avec la tranche supérieure = [1 2 1; 2 4 2; 1 2 1]; tranche médiane = [2 4 2; 4 8 4; 2 4 2]; tranche inférieure = [1 2 1; 2 4 2; 1 2 1]. En échantillonnant +/- 0,5 voxels dans chaque dimension, vous le faites avec seulement 8 récupérations de texture au lieu de 27. Je le démontre dans GLSL en tant que fichier de shader MRIcroGL - il suffit de déposer le script ci-dessous en tant que "a.txt" et de le placer dans Dossier "Shader" de MRIcroGL. Lorsque vous relancez le programme, vous verrez votre image rayée floue. Cliquer sur la case "doBlur" active et désactive le flou. Utiliser mon processeur graphique Intel intégré dans mon ordinateur portable et le "chris_t1" image fournie avec MRIcroGL J'obtiens 70fps sans flou (1 fetch de texture) et 21fps avec flou (8 fetches). La plupart du code n'est qu'un lanceur de rayons classique, le conditionnel "doBlur" résume votre question.
//-------a.txt suit
la source