É possível falsificar o desfoque através de imagens?

9

Estou usando o libGDX para um jogo Android; Até onde eu sei, ele não tem uma API para desfocar.

Lendo na Wikipedia, parece que o desfoque é formado pela configuração dos valores RGB de cada pixel na média de todos os valores adjacentes. O que não parece fácil na libGDX - configuração de dados de pixel.

Então, minha pergunta é simples:

É possível falsificar (um decente) desfoque usando apenas imagens?

Posso potencialmente sobrepor várias imagens (em número, transparência, tipo); mas posso criar um borrão convincente como esse?

Estou tentado a dizer "não", mas talvez alguém tenha conseguido algo semelhante. Para maior clareza, quero um conjunto de mais de 1 imagens genéricas que eu possa render sobre QUALQUER imagem para gerar um efeito de desfoque.

ashes999
fonte
boa pergunta! Eu pensei na mesma coisa, eu mesmo!
Daniel diz Reinstate Monica
@DantheMan em qual plataforma?
ashes999
Unity3d ou a linguagem de sombreamento CG.
Daniel diz Reinstate Monica
Você sugere a sobreposição de imagens transparentes umas sobre as outras. Se você compensá-los um pouco, você vai ser a média dos pixels, alcançando borrão
Jeff
11
@ ashes999, se você estiver procurando por uma "imagem mágica" que possa ser sobreposta às coisas para torná-las embaçadas, isso não existe. Misturar alfa (sobreposição) não é remotamente a mesma coisa que desfocar, desculpe.
Nathan Reed

Respostas:

7

Se você conseguir mesclar imagens de forma aditiva e multiplicá-las por uma constante enquanto faz isso, poderá fazer um desfoque. Em vez de calcular a média dos pixels em uma vizinhança, você calcula a média de várias cópias da imagem deslocadas por um pequeno número de pixels. Ou, geralmente, você pode fazer um desfoque gaussiano ou qualquer outro tipo de desfoque, controlando os pesos - isto é, multiplicando cada cópia deslocada da imagem por uma constante, à medida que ela é adicionada ao resto.

Algoritmicamente, seria algo parecido com isto:

clear output_image to 0
foreach offset, weight in filter_kernel:
    output_image += input_image * weight, shifted by offset

Você usaria os mesmos deslocamentos e pesos da maneira padrão de fazer um desfoque. Existem muitos artigos na Web sobre como gerar os pesos de um desfoque gaussiano, por exemplo.

Nathan Reed
fonte
+1 boa resposta. No meu caso, não tenho capacidade aditiva.
ashes999
0

O desfoque pode ser uma operação cara, talvez uma abordagem diferente possa funcionar, por exemplo:

  1. Armazene várias cópias da imagem desfocada em várias direções diferentes (por exemplo, múltiplos de 45 graus) e, em seguida, exiba a imagem correspondente mais próxima em tempo de execução. Isso oferecerá o melhor desempenho, ao custo do uso de memória.
  2. Escale a imagem para baixo e depois volte ao tamanho normal com suavização de borda / suavização. Geralmente, isso pode ser feito com hardware gráfico com muito pouco impacto no desempenho.
Luke Van In
fonte
Não funcionará, porque precisa ser dinâmico, ou seja, não posso saber a configuração exata da tela antes do tempo.
ashes999