É possível implementar o shader de fragmentos para fazer o desfoque gaussiano de uma passagem? Eu encontrei muita implementação do blur de duas passagens (gaussian e 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/
e assim por diante.
Eu estive pensando em implementar o desfoque gaussiano como convolução (na verdade, é a convolução, os exemplos acima são apenas aproximações):
glsl
fragment-shader
blur
martin pilch
fonte
fonte
O truque para o desfoque gaussiano rápido com o GLSL é aproveitar o fato de que a GPU fornece interpolação linear no hardware. Portanto, você pode testar efetivamente quatro pixels 2D com uma única pré-busca ou oito voxels 3D. Ao decidir onde coletar amostras, você pode ponderar a saída. A referência definitiva é a "Filtragem rápida de textura de terceira ordem" de Sigg e Hadwiger, que você pode encontrar on-line.
Para uma explicação legível, localize a página da web "Desfoque gaussiano eficiente com amostragem linear". Como observado, como o desfoque gaussiano é separável com núcleos largos, é mais eficiente fazer uma passagem por dimensão.
No entanto, você também pode usar esse truque para aproximar um gaussiano com um núcleo apertado em uma única passagem. No exemplo abaixo, eu emulo o kernel 3D com a fatia superior = [1 2 1; 2 4 2; 1 2 1]; fatia do meio = [2 4 2; 4 8 4; 2 4 2]; fatia inferior = [1 2 1; 2 4 2; 1 2 1] Ao amostrar +/- 0,5 voxels em cada dimensão, você faz isso com apenas 8 busca de textura em vez de 27. Estou demonstrando isso no GLSL como um arquivo de sombreador MRIcroGL - basta salvar o script abaixo como "a.txt" e colocá-lo em Pasta "Shader" do MRIcroGL. Ao reiniciar o programa, você verá a sua imagem com raios fundidos embaçada. Clicar na caixa de seleção "doBlur" ativa e desativa o desfoque. Usando minha GPU Intel integrada no meu laptop e o "chris_t1" Na imagem que acompanha o MRIcroGL, obtenho 70fps sem desfocagem (1 busca de textura) e 21fps com desfocagem (8 buscas). A maior parte do código é apenas um lançador de raios clássico, o condicional "doBlur" encapsula sua pergunta.
O arquivo //-------a.txt segue
fonte