Ich weiß nicht, in was Sie programmieren, aber so habe ich es in XNA gehandhabt:
- Beim Zeichnungsaufruf wird ein
List<Light>
Objekt erstellt / gelöscht.
- Während der Kachel-Zeichenschleife wird für jede Kachel geprüft, ob mit ihr Lichter verknüpft sind. Wenn dies der Fall ist, werden die
Light
Objekte an die angefügt List<Light>
.
- Die Kacheln werden einzeln gezeichnet
RenderTarget2D
.
- Nach der Kachelschleife wird die Liste von
Light
s iteriert und RenderTarget2D
mit einer von mir erstellten Textur wie folgt gezeichnet :
(Hinweis: Ich habe hier die Werte R, G und B verwendet, aber Sie sollten wahrscheinlich den Alphakanal in Ihrer verwenden tatsächliche Textur.)
- Mit einem benutzerdefinierten Shader rendere ich die Kacheloberfläche auf dem Bildschirm und übergebe die Beleuchtungsoberfläche als Parameter, der für den "Dunkel" -Wert bei jedem Pixel abgetastet wird.
Nun gibt es ein paar Dinge zu beachten:
Zu Punkt 4:
Eigentlich habe ich zwei benutzerdefinierte Shader, einen zum Zeichnen der Lichter zum Beleuchtungs-Rendering-Ziel (Schritt 4) und einen zum Zeichnen des Kachel-Rendering-Ziels zum Bildschirm unter Verwendung des Beleuchtungs-Rendering-Ziels (Schritt 5).
Mit dem unter Punkt 4 verwendeten Shader kann ich einen "Leuchtkraft" -Wert hinzufügen (was ich nenne). Dieser Wert wird float
mit jedem Pixel in der Textur multipliziert, bevor er zum Render-Ziel hinzugefügt wird, damit ich die Lichter im Wesentlichen heller oder dunkler machen kann.
An dieser Stelle berücksichtige ich auch den "Skalierungs" -Wert des Lichts, was bedeutet, dass ich mit nur einer Textur große oder kleine Lichter haben kann.
Zu Punkt 5:
Stellen Sie sich das Beleuchtungs-Rendering-Ziel so vor, dass es im Wesentlichen einen Wert für jedes Pixel von 0 (schwarz) bis 1 (weiß) aufweist. Der Shader multipliziert diesen Wert im Wesentlichen mit den RGB-Werten für ein Pixel im Kachel-Rendering-Ziel, um das endgültig gezeichnete Bild zu erhalten.
Ich habe hier auch etwas mehr Code, in dem ich (an den Shader) einen Wert übergebe, der als Tag / Nacht-Overlay-Farbe verwendet werden soll. Dies wird auch mit den RGB-Werten multipliziert und in die Berechnungen der Beleuchtungsrenderingziele einbezogen.
Auf diese Weise können Sie nicht verhindern, dass Licht um Objekte herumgeht, und so weiter, aber zumindest für meine Zwecke ist es einfach und funktioniert gut.
Ich habe hier und hier detailliertere Blog-Beiträge verfasst , die dir vielleicht helfen. Ich habe momentan keine Zeit, aber wenn Sie möchten, kann ich hier auf gamedev näher eingehen.
Oh, und hier ist ein Blick darauf in meinem Karteneditor: