¿Es posible implementar fragment shader para hacer un desenfoque gaussiano de una pasada? He encontrado mucha implementación de desenfoque de dos pasos (desenfoque gaussiano y de cuadro):
- 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/
y así.
He estado pensando en implementar el desenfoque gaussiano como convolución (de hecho, es la convolución, los ejemplos anteriores son solo aproximaciones):
glsl
fragment-shader
blur
Martin Pilch
fuente
fuente
El truco para el desenfoque gaussiano rápido con GLSL es aprovechar el hecho de que la GPU proporciona interpolación lineal en hardware. Por lo tanto, puede muestrear eficazmente cuatro píxeles 2D con una sola captación previa u ocho voxels 3D. Al decidir dónde tomar muestras, puede ponderar la salida. La referencia definitiva es el "Filtrado rápido de texturas de tercer orden" de Sigg y Hadwiger que puede encontrar en línea.
Para obtener una explicación legible, busque la página web "Desenfoque gaussiano eficiente con muestreo lineal". Como se señaló, dado que el desenfoque gaussiano es separable con núcleos anchos, es más eficiente hacer una pasada por dimensión.
Sin embargo, también puede usar este truco para aproximar un gaussiano con un núcleo ajustado en una sola pasada. En el siguiente ejemplo, emulo el núcleo 3D con el segmento superior = [1 2 1; 2 4 2; 1 2 1]; rebanada del medio = [2 4 2; 4 8 4; 2 4 2]; rebanada inferior = [1 2 1; 2 4 2; 1 2 1]. Al muestrear +/- 0.5 vóxeles en cada dimensión, hace esto con solo 8 captaciones de textura en lugar de 27. Estoy demostrando esto en GLSL como un archivo de sombreador MRIcroGL: simplemente suelte el guión a continuación como "a.txt" y colóquelo en Carpeta "Shader" de MRIcroGL. Cuando reinicie el programa, verá su imagen de emisión de rayos borrosa. Al hacer clic en la casilla de verificación "doBlur" se activa y desactiva el desenfoque. Uso de mi GPU Intel integrada en mi computadora portátil y el "chris_t1" imagen que viene con MRIcroGL Obtengo 70 fps sin desenfoque (1 búsqueda de textura) y 21 fps con desenfoque (8 descargas). La mayor parte del código es solo un clásico lanzador de rayos, el condicional "doBlur" encapsula su pregunta.
//-------a.txt sigue el archivo
fuente