Ich möchte einen 2D-Spotlight-Effekt erstellen, mit dem ein Spotlight auf mehrere Objekte angewendet werden kann. Das heißt, als hätten mehrere Sprites Fackeln in der Hand. Für ein einzelnes Objekt (ein Spotlight) verwende ich eine Technik, bei der ich ein Sprite mit Farbverlauf überlagere und den Mittelpunkt diesem Objekt nachjagen lasse. Diese Technik eignet sich gut für einen einzelnen Scheinwerfer. Hier ist ein Screenshot, um zu veranschaulichen, wovon ich spreche:
Single Spotlight - Funktioniert
Das Problem, auf das ich stoße, ist, dass sich diese Technik nicht auf mehrere Entitäten erstreckt. Wenn ich ein anderes Spotlight-Bild überlagere, treten mehrere Probleme auf. Hier ist ein simulierter Screenshot:
Mehrere Scheinwerfer = Probleme
Das offensichtlichste Problem sind die sichtbaren Ecken. Dies könnte gelöst werden, indem das Scheinwerferbild gigantisch gemacht wird, um die gesamte Ebene abzudecken, aber das fühlt sich nicht richtig an. Das zweite und schwierigere Problem ist, dass ich die Dunkelheit mit dieser Technik effektiv multipliziere. Jedes hinzugefügte Sprite verdunkelt also alle anderen. Offensichtlich gehe ich dieses Problem falsch an.
Irgendwelche Ideen?
Fortsetzung der Bemühungen
In den Kommentaren wurden einige Überblendungsoptionen erörtert. Hier ist mein aktuelles Denken. In meinem obigen Beispiel mit einem einzelnen Spotlight verwende ich eine Bilddatei, die ungefähr so aussieht: (Ich habe die Transparenz durch die Farbe Grün ersetzt, um die Darstellung zu vereinfachen.)
Wie oben diskutiert, besteht das Problem darin, dass das Alpha-Mischen dieses Bildes mit einem anderen Bild nicht den gewünschten Effekt erzeugt. Stattdessen wird dies erzeugt:
Das ist für mich kein Problem mit den Mischoptionen. Das Problem ist meines Erachtens, dass in diese Art von Bild die Transparenzmaske und das Bild (ein schwarzes Quadrat) eingebaut sind, wenn sie getrennt werden sollen.
Anstelle eines schwarzen Bildes mit integrierter ausgeschnittener Transparenz sollte ich Transparenzmasken verwenden, die zur Laufzeit für das schwarze Quadrat verwendet werden. Dabei kann ich immer noch keine herkömmliche weiße und schwarze Transparentmaske verwenden, da sonst das gleiche Problem auftritt. Hier ist ein Beispiel, diesmal stehen Weiß und Schwarz für Weiß und Schwarz:
Die Lösung scheint darin zu bestehen, eine Transparenzmaske anzuwenden, die selbst Transparenz nutzt. So ähnlich: (grün = transparent)
Auf diese Weise können mehrere Transparenzmasken Alpha-gemischt und dann als Transparenzmaske gegen das schwarze Quadrat verwendet werden. Hier ist ein Beispiel für zwei der Transparenzmasken, die Alpha zusammenblendet:
Jedenfalls ist das der Ansatz, an dessen Umsetzung ich gerade arbeite. Ich werde Ergebnisse veröffentlichen, wenn dies funktioniert. Was ich (derzeit) nicht weiß, ist, ob ich eine Transparenzmaske verwenden kann, die selbst Transparenz hat.
Antworten:
Konzeptionell besteht die Lösung für mehrere Scheinwerfer aus:
Der Trick besteht darin, zu verstehen, dass Alpha-Blending einen oder mehrere dieser Schritte ausführen kann. Alpha-Blending bezieht sich nur auf die Verwendung einer Alpha-Karte / eines Alpha-Bildes, um die Pixel eines Bildes oder einer Textur auf einfache Weise zu ändern. Dies bedeutet normalerweise auch, dass es sich um einen schnellen Satz von Funktionen handelt oder mit speziellen Hardwarebefehlen implementiert wird, um ihn schneller zu machen. Sie können dies mit regulären Arrays und normalen Sprachbefehlen tun, aber die Verwendung der speziellen Funktionen der Alpha / Mischbibliothek ist wahrscheinlich besser. ... und keine Bugs haben. Manchmal bedeutet dies, dass die Pixel teilweise transparent sind. In Ihrem Fall bedeutet dies jedoch Folgendes:
In der Dokumentation zu Ihren Alpha-Mischfunktionen werde ich nachsehen, welche Funktionen sie zum Kombinieren von Pixeln verschiedener Art bieten. Ich vermute, dass sie Funktionen für jeden der Schritte haben werden, die Sie ausführen müssen, aber sie könnten unter Namen stehen, die nicht offensichtlich sind.
quelle