Est-il possible de simuler le flou via des images?

9

J'utilise libGDX pour un jeu Android; pour autant que je sache, il n'a pas d'API pour le flou.

En lisant sur Wikipedia, il semble que le flou se forme en définissant les valeurs RVB de chaque pixel sur la moyenne de toutes les valeurs adjacentes. Ce qui ne semble pas facilement possible dans libGDX - définir des données de pixels.

Ma question est donc simple:

Est-il possible de simuler un flou (décent) en utilisant uniquement des images?

Je peux potentiellement superposer plusieurs images (en nombre, transparence, type); mais puis-je créer un flou convaincant comme celui-ci?

Je suis tenté de dire «non», mais peut-être que quelqu'un d'autre a réalisé quelque chose de similaire. Pour plus de clarté, je veux un ensemble de 1+ images génériques que je peux rendre au-dessus de N'IMPORTE QUELLE image pour générer un effet flou.

cendres999
la source
bonne question! J'ai pensé à la même chose moi-même!
Daniel dit Réintégrer Monica
@DantheMan sur quelle plateforme?
ashes999
Unity3d ou le langage d'ombrage CG.
Daniel dit Réintégrer Monica
Vous proposez de superposer des images transparentes les unes sur les autres. Si vous les décalez légèrement, vous allez faire la moyenne des pixels, obtenir un flou
Jeff
1
@ ashes999, si vous cherchez une "image magique" qui peut être superposée à des choses pour les rendre floues, cela n'existe pas. Le mélange alpha (superposition) n'est pas à distance la même chose que le flou, désolé.
Nathan Reed

Réponses:

7

Si vous pouvez mélanger les images par addition et les multiplier par une constante tout en faisant cela, vous pouvez faire un flou. Au lieu de faire la moyenne des pixels d'un quartier, vous feriez la moyenne de plusieurs copies de l'image déplacées par un petit nombre de pixels les unes des autres. Ou plus généralement, vous pouvez faire un flou gaussien ou tout autre type de flou, en contrôlant les poids - c'est-à-dire en multipliant chaque copie déplacée de l'image par une constante au fur et à mesure qu'elle est ajoutée au reste.

Algorithmiquement, cela ressemblerait à ceci:

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

Vous utiliseriez les mêmes décalages et poids que dans la manière standard de faire un flou. Il existe de nombreux articles sur le Web sur la façon de générer les poids pour un flou gaussien, par exemple.

Nathan Reed
la source
+1 belle réponse. Dans mon cas, je n'ai pas de capacité additive.
ashes999
0

Le flou peut être une opération coûteuse, une approche différente pourrait peut-être fonctionner, par exemple:

  1. Stockez plusieurs copies de l'image floue dans plusieurs directions différentes (par exemple des multiples de 45 degrés), puis affichez l'image correspondante la plus proche au moment de l'exécution. Cela offrira les performances les plus élevées, au détriment de l'utilisation de la mémoire.
  2. Redimensionnez l'image puis revenez en taille réelle avec l'anticrénelage / lissage. Cela peut souvent être fait avec du matériel graphique avec très peu d'impact sur les performances.
Luke Van In
la source
Cela ne fonctionnera pas, car il doit être dynamique, c'est-à-dire que je ne peux pas connaître la configuration exacte de l'écran à l'avance.
ashes999