2016-07-31 40 views
0

Ich habe einen AVPlayer ein Video zu spielen, und ich möchte eine Art "Gaussian Gaussian"/"Reverse Iris" Unschärfe darauf anwenden.Erstellen einer animierten, partiellen Unschärfe eines AVPlayer Video

Was ich damit meine ist, dass ich die Mitte des Videos habe die höchste Menge an Unschärfe angewendet und wie Sie weiter weg von diesem Mittelpunkt das Video wird weniger verschwommen. Wie folgt aus:

Botticelli Venus Blurred

Ich mag dann in der Lage sein, um diese Unschärfe zu bewegen (beispielsweise hin und her über das Video) als Video abgespielt wird.

Irgendwelche Ideen, wie dies getan werden könnte?

+0

Es gibt einige Möglichkeiten, dies zu tun, aber was am besten ist, hängt von der Situation ab ... Ist das Video korrigiert, anstatt Bilder von der Kamera aufzunehmen? Ist der Ort der Unschärfe in Echtzeit fixiert oder beweglich? Welchen Unschärfe-Algorithmus versuchen Sie zu implementieren und wie genau muss die Unschärfe sein? –

+0

Video ist fixiert; Unschärfe ist animiert, aber nicht unbedingt in Echtzeit, die Animation kann vorberechnet/angewendet werden, bevor sie angezeigt wird/immer dieselbe sein; Wie oben erwähnt, würde ich eine "Gaussian Gaussian" Unschärfe wünschen, bei der die Intensität der Unschärfe abnimmt, wenn Sie sich von der Mitte entfernen. Irgendwelche Gedanken, wo ich damit anfangen könnte? – raphaelrk

Antwort

0

Die Gauß'sche Unschärfe wird normalerweise aufgrund eines enormen Leistungsgewinns in zwei vertikale und horizontale Pässe aufgeteilt. Wenn ein Teil der Leinwand nicht verschwommen ist, kann diese Methode nicht direkt angewendet werden. Eine direkte Methode besteht also darin, einen Unschärfe-Shader mit einem Durchgang zu erstellen, dem Sie einen Fokusort und eine Größe hinzufügen. Abhängig von der aktuellen Position des Fragments können Sie dann einstellen, wie viel Unschärfe auf dieses Pixel angewendet werden soll. Dies ist einfach eine Standardmatrix zu modifizieren, die fortschreitend weniger Abtastungen um das Fragment herum verwendet und den Effekt von weit entfernten Pixeln herunterlädt (Hinzufügen der Differenz zum zentralen Pixel), wenn sie sich in der Nähe des Fokus befinden.

Eine etwas intelligentere Lösung besteht darin, die unscharfe Version des Bildes mit der Originalversion zu mischen. Dieses Ergebnis ist möglicherweise nicht genau das gleiche, aber es ist sehr nahe. Es gibt viele Möglichkeiten, dies zu tun und wenn möglich, wäre es am besten, das gesamte Video zu verwischen und das Original zu bewahren. Sie würden dann 2 Texturen verwenden und sie in jedem Frame zusammenmischen, um den gewünschten Effekt zu erzielen. ABER wenn Sie genial sind, werden Sie ein einzelnes Video erzeugen, das sowohl die originale als auch die unscharfe Version enthält (zum Beispiel original in der oberen Hälfte und verschwommen unten), was die Leistung erhöht und mögliche Probleme beseitigt, indem Sie durch 2 verschiedene suchen Videos.

Also, um die 2 zusammen mit Fokus zu mischen, haben Sie fast die gleiche Shader-Prozedur, aber einfacher. Verwenden Sie einen Fokuspunkt in einem Fragment-Shader und eine Fokusgröße. Berechnen Sie dann den Abstand zwischen dem aktuellen Fragment und dem Fokuspunkt, um die Größe des unscharfen Bildes zu ermitteln, das angewendet werden soll. Mit der Skala können Sie mix verwenden, um die beiden effektiv zu kombinieren.

Dieses Verfahren eignet sich besonders, wenn der Benutzer den Fokus ändern kann, da keine zusätzlichen Berechnungen durchgeführt werden müssen. Es kann sehr zeitaufwendig sein, das gesamte Video zu verwischen.

Alles dazwischen kann getan werden. Zum Beispiel können Sie einen FBO mit angehängter Textur verwenden, um eine unscharfe Version des Samples in Echtzeit zu erstellen und dann mix mit Original und der FBO-Textur zu verwenden.