2016-05-28 23 views
4

Ich entwickle ein 2D-Spiel in SDL 2.0 und habe Probleme mit meinem Beleuchtungssystem. Ich möchte den Bildschirm mit Nebel füllen und einen transparenten Kreis um den Player erstellen (unten links). Ich weiß, wie man mit SDL_BLENDMODE_MOD (unten rechts) einen dunklen Raum mit einem getönten Licht macht, aber ich kann den Nebel nicht machen. Ich habe versucht, mehrere Texturen über den Bildschirm mit jeder Kombination von SDL_SetRenderDrawBlendMode() und SDL_SetTextureBlendMode() zu überlagern, die ich mir vorstellen kann.SDL2 - Zeichne einen vollständig transparenten Kreis auf einer Textur

image

Ich habe gesucht und gefunden Lösungen auf Stackoverflow wie this, aber sie verwenden SDL Oberflächen und vorgefertigte Lichtbilder. Ich werde die Form und Größe meines Eingabebildes (oben rechts) dynamisch ändern, also brauche ich etwas flexibleres.

Lösung 1: Anstelle eines weißen Kreises und schwarzen Hintergrunds verwende ich einen schwarzen Kreis und einen Marine-Hintergrund. Ich mische das dann unter Verwendung screen blending und bekomme meinen Nebel (ich habe dies in einem Bildeditor getestet, um das Bild unten links zu bekommen). Leider hat SDL kein SDL_BLENDEMODE_SCREEN.

Lösung 2: Erstellen Sie eine halbtransparente Nebelschicht und stanzen Sie ein vollständig transparentes Loch darin. Leider weiß ich nicht, wie man eine Textur mit einem transparenten Loch überschreibt. Ich habe versucht, meine drawing mode auf SDL_BLENDEMODE_NONE zu setzen und einen vollständig transparenten Kreis zu zeichnen, aber es erzeugt nur vollständig undurchsichtige Kreise. Die Dokumentation sagt, ich kann das Ziel Alpha ersetzen, aber das scheint nicht zu funktionieren ...

Antwort

0

(Das folgende ist eine Reihe von Vorschlägen, keine endgültige Antwort. Wenn Sie Shadern verwenden können, ist Ihre Antwort ein One- Ich kenne keine einfache Lösung, die genau das gibt, was Sie wollen.)

Zuerst müssen Sie wahrscheinlich Ihre "Maske" Bild im Alpha - Kanal des zu generieren (oder zu speichern) Textur (anstelle der Farbkanäle), damit es in der Alpha-Mischung einen Effekt hat.

Und ich empfehle, einen invertierten Alpha-Wert in der Maske Textur: Setzen Sie den Kreis (oder welche Form) um den Spieler Null, und füllen die Nebel Teile mit einem "Nebel Wert" in der Nähe von 255 (oder 1,0, Wenn Sie reelle Zahlen verwenden.) So können Sie verhindern, dass etwas in den leeren Kreis in der Mitte gezeichnet wird.

Jetzt, wenn Sie die gesamte Maske Textur mit einer soliden "Nebelfarbe" gefüllt haben (wahrscheinlich keine Notwendigkeit, eine Form oder etwas zu machen), achten Sie darauf, den Alphakanal nicht zu stören, setzen Sie SDL_SetTextureBlendMode() auf SDL_BLENDMODE_BLEND und tun Sie a SDL_RenderCopy(), werden Sie etwas erreichen, was Sie wollen. Insbesondere, wenn Sie eine helle "Nebelfarbe" (nicht Wert, Farbe) in der Maskenstruktur, z. wie die Cyan in Ihren Beispielbildern. Es passt nicht genau zu Ihrem "Bildschirm-Mischmodus", aber Sie können sich nähern.

Und Sie können auch mit SDL_BLENDMODE_ADD experimentieren. Es könnte Ihnen sogar bessere Ergebnisse (für einen nebligen Effekt) geben.

In jedem Fall, um zu wiederholen, in Ihrer Nebelmaske Textur (die die "Quelle" in all Ihren Mischungen ist) setzen Sie eine feste Nebelfarbe und stellt den Alphakanal an einen festen Schleierwert und dann malt den klaren Bereich um den Spieler im Alphakanal nur, einen Wert von Null verwenden.

+0

Wie speichere ich ein Bild im Alpha-Wert einer Textur?Ich weiß, wie RenderCopy() eine Textur über eine andere, aber ich weiß nicht, wie Sie auf den Alpha-Kanal einer Textur zugreifen. – DragonDePlatino