Licht musst du immer additiv zeichnen, spricht die Pixelwerte der Lichter müssen einfach addiert werden:
Code:
Rot_Neu = Rot_Licht + Rot_Alt;
Blau_Neu = Blau_Licht + Blau_Alt;
Grün_Neu = Grün_Licht + Grün_Alt;
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.
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:
Rot_Ziel = Rot_Lichter * Rot_Szene;
Blau_Ziel = Blau_Lichter * Blau_Szene;
Grün_Ziel = Grün_Lichter * Grün_Szene;
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.
Also ist die Vorgehensweise:
- Zeichne alle Lichter additiv getrennt in einen zunächst schwarzen Off-Screen buffer
- Zeichne deine Szene ganz normal und zeichne den Lichter-Off-Screen-Buffer multiplikativ auf deine Szene oben drauf und schon bist du fertig
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