2016-07-31 1 views
0

J'ai un AVPlayer en train de lire une vidéo, et je souhaite lui appliquer une sorte de flou gaussien gaussien/iris inversé. Ce que je veux dire par là, c'est que le centre de la vidéo est le plus flou et que lorsque vous vous éloignez de ce point central, la vidéo est moins floue. Comme ceci:Création d'un flou animé et partiel d'une vidéo AVPlayer

Botticelli Venus Blurred

Je veux donc être en mesure de déplacer ce flou autour (par exemple dans les deux sens à travers la vidéo) que les jeux vidéo.

Des idées comment cela pourrait-il être fait?

+0

Il y a plusieurs façons de le faire mais quelle est la meilleure dépend de la situation ... La vidéo est-elle fixée au lieu de prendre des images de la caméra? L'emplacement du flou est-il fixe ou mobile en temps réel? Quel algorithme de flou essayez-vous de mettre en œuvre et à quel point le flou doit-il être précis? –

+0

La vidéo est fixe; Le flou est animé mais pas nécessairement en temps réel, l'animation peut être précalculée/appliquée avant visualisation/toujours la même chose; Comme indiqué ci-dessus, je voudrais un flou «gaussien gaussien» où l'intensité du flou diminue à mesure que vous vous éloignez de son centre. Des idées sur où je pourrais commencer avec ceci? – raphaelrk

Répondre

0

Le flou gaussien est généralement séparé en deux passes, verticales et horizontales en raison d'un gain de performance énorme. Si une partie de la toile n'est pas floue, cette méthode ne peut pas être appliquée directement. Ainsi, une méthode simple consiste à créer un shader de flou à passage unique auquel vous ajoutez un emplacement du focus et une taille. En fonction de la position actuelle du fragment, vous pouvez ajuster la quantité de flou à appliquer à ce pixel. Il s'agit simplement de modifier une matrice standard en utilisant progressivement moins d'échantillons autour du fragment et de réduire l'effet des pixels lointains (en ajoutant la différence au pixel central) lorsque le focus est proche.

Une solution plus intelligente consiste à mélanger la version floue de l'image avec la version originale. Ce résultat n'est peut-être pas exactement le même mais il est extrêmement proche. Il y a plusieurs façons de le faire et, si possible, il serait préférable de brouiller toute la vidéo et de préserver l'original. Vous utiliserez alors 2 textures et les fondrez ensemble sur chaque image pour obtenir l'effet désiré. MAIS si vous êtes génial, vous générez une seule vidéo qui aura à la fois la version originale et floue (par exemple original sur la moitié supérieure et floue sur le fond) qui va gagner en performance et permettra d'éliminer tous les problèmes possibles en cherchant à travers 2 différents vidéos.

Donc, pour mélanger les 2 ensemble en utilisant le focus, vous aurez à peu près la même procédure de shader mais plus facile. Utilisez un point de mise au point dans un fragment shader et une taille de focus. Calculez ensuite la distance entre le fragment actuel et le point de mise au point pour obtenir l'échelle de l'image floue qui doit être appliquée. Avec l'échelle, vous pouvez utiliser mix pour combiner efficacement les deux.

Cette procédure est particulièrement utile si l'utilisateur peut modifier la mise au point car aucun calcul supplémentaire ne doit être effectué. Toujours flouter la vidéo entière pourrait prendre beaucoup de temps.

Tout ce qui se trouve entre les deux procédures peut être effectué. Par exemple, vous pouvez utiliser un FBO avec une texture attachée pour créer une version floue de l'échantillon en temps réel, puis utiliser mix avec l'original et la texture FBO.