![]() |
Licht-Masken
Liste der Anhänge anzeigen (Anzahl: 1)
Hi DPler, :hi:
ich bin seit ein paar Tagen dabei, eine kleine 2d-Simulation zu erstellen. Was ich dabei schon immer toll fand, war Licht. Nach einigem googlen und experimentieren habe ich es sogar geschafft, eine Maske zu erstellen, die eine Art Licht auf der Oberfläche erzeugt. Farbige Bereiche auf der Maske machen die darunterliegende Szene durchsichtig, durchsichtige Bereiche der Maske überblenden die Szene mit Schwarz. Der Effekt sieht schon sehr interessant und nicht schlecht aus - aber das reicht mir noch nicht. Was ich noch gerne hätte, wäre farbiges Licht. Leider ist es mit meiner aktuellen Methode völlig egal, welche Farbe ich benutze, was zählt ist immer nur die Transparenz. Im Anhang ist eine Maske, die eigentlich rotes Licht erzeugen sollte (oder rotes Licht filtern... Mir fehlt da leider grundsätzlich die Theorie was Farbmischung mit dem PC angeht :-( ). Alles was diese Maske aber tut, ist einen Gegenstand der sich aus dessen Mitte hinausbewegt langsam auszublenden. Meine Frage ist jetzt, wie ich sowas in der Theorie am besten anstelle. Meine Grafikbibliothek unterstützt von sich aus keine Lichteffekte. Da ich mit Python arbeite, sind Codebeispiele wahrscheinlich auch nicht hilfreich. Ich würde mich freuen, wenn ihr mir erklären könnt, wie man mit farbigem Licht umgeht oder eventuell auch gute Quellen kennt. :-) Liebe Grüße, Valle |
AW: Licht-Masken
Licht musst du immer additiv zeichnen, spricht die Pixelwerte der Lichter müssen einfach addiert werden:
Code:
Dies ist ja auch logisch - stell dir mal zwei Taschenlampen vor, die sich gegenseitig überschneiden - in der Mitte wird es entsprechen heller, da sich die Lichtintensität aufaddiert hat.
Rot_Neu = Rot_Licht + Rot_Alt;
Blau_Neu = Blau_Licht + Blau_Alt; Grün_Neu = Grün_Licht + Grün_Alt; Problem bei der "Simulation" ist jedoch, dass deine Szene ohne Licht komplett schwarz ist - und wenn du auf komplett schwarz die Lichtwerte aufaddierst, wird sie dadurch nicht sichtbar. Deshalb musst du die Pixelwerte der Lichter mit denen der Szene multiplikativ verrechnen. Sprich:
Code:
Das ist auch logisch - stell dir vor, kein Licht ist an, also RGB(0, 0, 0), so ist auch kein Pixel der Szene sichtbar. Ist rotes Licht an, so sind auch nur die roten Pixel sichtbar.
Rot_Ziel = Rot_Lichter * Rot_Szene;
Blau_Ziel = Blau_Lichter * Blau_Szene; Grün_Ziel = Grün_Lichter * Grün_Szene; Also ist die Vorgehensweise:
PS: Die Lichter sollten keine transparenz haben sein, sondern einfach nach schwarz überblenden, durch das additive Zeichnen bedeutet schwarz ja einfach "keine Änderung" PPS: Hier gab es letztens einen Thread wo jemand das Ganze mit Andorra 2D umgesetzt hat, also schau mal danach |
AW: Licht-Masken
Zitat:
Delphi-Quellcode:
[edit]
Rot_Ziel = Min(Rot_Lichter, Rot_Szene);
Blau_Ziel = Min(Blau_Lichter, Blau_Szene); Grün_Ziel = Min(Grün_Lichter, Grün_Szene); obwohl ... hast irgendwie Recht, also so?
Delphi-Quellcode:
Rot_Ziel = Rot_Szene * (Rot_Lichter / 255{Rot_Lichter_Max});
Blau_Ziel = Blau_Lichter * (Blau_Szene / 255{Blau_Lichter_Max}); Grün_Ziel = Grün_Lichter * (Grün_Szene / 255{Grün_Lichter_Max}); |
AW: Licht-Masken
Oh, das habe ich vergessen zu sagen, ich gehe hier wirklich davon aus, dass sich alle Farbwerte im Intervall [0,1] befinden, sonst sind die Berechnungen natürlich falsch.
|
AW: Licht-Masken
Hallo,
vielen Dank für deine tolle Erklärung! :-) Im Moment habe ich noch Probleme mit der Transparenz, welche jetzt nicht mehr will. Farblich funktioniert es dafür um so besser. Hoffentlich komme ich noch drauf, was hier schief läuft. Du kannst ja mal schnell schauen, ob dir direkt was in's Auge springt, wenn du Lust hast. Vielleicht ist es ja ein grober Fehler.
Code:
Edit:// Gerade dein PPS gesehen. Jetzt funktioniert's. Vielen Dank nochmal! :-) :love:
def mainloop(self):
# ... self.screen.fill((0, 0, 0)) self.draw() # draw the szene self.draw_lights() # draw lights on offscreen buffer (self.lights) self.screen.blit(self.lights, (0, 0), None, BLEND_RGBA_MULT) # ... def draw_lights(self): self.lights.fill((0, 0, 0, 0)) self.lights.blit(self.images['mask'], (0, 0), None, BLEND_RGBA_ADD) Liebe Grüße, Valle :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz