[FIXED] Photoshop Drop Shadow Style in GLSL

Ausgabe

Ich versuche, den Ebenenstil Schlagschatten von Adobe Photoshop in OpenGL zu implementieren. Ich muss den Rändern des Schattens eine Unschärfe hinzufügen, die durch die Eigenschaft “Größe” in Photoshop gesteuert wird. Ich dachte zuerst, dass es in Ordnung wäre, ihn durch einen typischen Gaußschen Unschärfe-Algo zu führen. Aber wenn ich mir den Effekt genauer ansehe, ist es mir klar dass die Gaußsche Unschärfe nicht den gleichen Effekt erzielen würde, da sie alle Fragmente des Rasters gleichmäßig verarbeitet. In Photoshop befinden sich die Unschärfebereiche immer an den Rändern der Schattenform. Diese werden zur Mitte der Form hin breiter. Jeder kann zeigen zu einem Algorithmus oder GLSL-Beispiel, das die Form an ihren Rändern basierend auf dem Größenparameter verwischt, genau wie in Photoshop?

UPDATE: Hier ist mein Endergebnis unter Verwendung des euklidischen Distanzfeldes und der Technik, die in
diesem Valve-Papier + dem kürzlich erschienenen Buch “OpenGL Insights” beschrieben wird:
Geben Sie hier die Bildbeschreibung ein

Lösung

Ich bin auch sehr an dieser Antwort interessiert, da ich versuche, die Photoshop-Ebenenstile in meinem Open-Source-Projekt zu replizieren:

https://github.com/vinniefalco/LayerEffects

Das ist, was ich weiß:

  • Schlagschatten und Innerer Schatten sind Duale voneinander. Das Hinzufügen eines Schlagschattens zu einer Ebene entspricht dem Hinzufügen eines inneren Schattens zu einer Ebene mit einer invertierten Maske.

  • Outer Glow mit auf „Precise“ eingestellter Technik berechnet eine Euclidian Distance Transform (EDT) mit einer Chamfer-Metrik.

  • Stroke auf Gradient gesetzt, “Shape Burst” verwendet einen identischen EDT.

  • Äußeres Leuchten mit auf „Weicher“ eingestellter Technik verwendet eine unbekannte Transformation, die mit der für Schlagschatten verwendeten identisch ist.

Da die Abstandstransformation in fast jedem Photoshop-Ebenenstil eine Schlüsselrolle spielt, liegt die Vermutung nahe, dass die unbekannte Transformation in Schlagschatten eine Variation des EDT ist. Die einzige andere Variation, die ich finden konnte, heißt “Gaussian Distance Transform” (GDT). Leider gibt es nur eine Beschreibung davon in dem Buch “2-D and 3-D Image Registration for Medical, Remote Sensing, and Industrial Applications”. Das PDF ist verfügbar:

http://read.pudn.com/downloads85/ebook/327739/Wiley%5B1%5D.Interscience.2-D.and.3-D.Image.Registration.for.Medical.Remote.Sensing.and.Industrial. Bewerbungen.pdf

Hier ist die Beschreibung der GDT:

Wenn wir ein Bild mit einer monoton steigenden radialen Funktion falten, wird ein Bild erhalten, das wie ein Distanztransformationsbild funktioniert. Als monoton ansteigende radiale Funktion kann die Inverse einer Gaußschen Funktion verwendet werden. Um die Abstandstransformation eines Bildes zu erhalten, wird das Bild daher mit einer Gaußschen Faltung gefaltet, und die Intensitäten des gefalteten Bildes werden invertiert. Die Berechnung der Abstandstransformation auf diese Weise macht die erhaltenen Abstände weniger empfindlich gegenüber Rauschen. Dies wird an einem Beispiel in Abb.4.6 demonstriert. Die Abbildungen 4.6a und 4.6b zeigen Abstandstransformationen der Bilder 4.5a bzw. 4.5b, berechnet durch Gaußsche Faltung. Im Vergleich zur euklidischen Abstandstransformation ist die durch Gaußsche Faltung berechnete Abstandstransformation weniger empfindlich gegenüber Rauschen.

Angesichts dieses Bildes:

Vor
(Quelle: imgfsr.com )

Hier ist die vorzeichenbehaftete euklidische Distanztransformation und die vorzeichenbehaftete Gaußsche Distanztransformation:

Sommerzeit
(Quelle: imgfsr.com )
GDT

(Bilder von http://www.imgfsr.com/ifsr_dtg.html )


Beantwortet von –
Vinnie Falco


Antwort geprüft von –
Cary Denson (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like

[FIXED] Verschieben

Ausgabe Ich habe eine Basisschicht – eine Karte von Europa. eine Reihe von „Länder“-Layern, die jedes Land repräsentieren,…