Je ne sais pas dans quoi vous programmez, mais voici comment je l'ai géré dans XNA:
- Lors de l'appel de dessin, un
List<Light>
objet est créé / effacé.
- Pendant la boucle de dessin des tuiles, chaque tuile est vérifiée pour voir si elle a des lumières associées. Si c'est le cas, les
Light
objets sont ajoutés au List<Light>
.
- Les tuiles sont dessinées seules
RenderTarget2D
.
- Après la boucle de tuiles, la liste des
Light
s est itérée et dessinée par eux-mêmes en RenderTarget2D
utilisant une texture que j'ai faite qui ressemble à ceci:
(Remarque: j'ai utilisé les valeurs R, G et B ici, mais vous devriez probablement utiliser le canal alpha dans votre texture réelle.)
- En utilisant un shader personnalisé, je rend la surface de la tuile à l'écran et je passe la surface d'éclairage en tant que paramètre qui est échantillonné pour la valeur "d'obscurité" à chaque pixel.
Maintenant, il y a quelques choses à noter:
Concernant le point 4:
J'ai en fait deux shaders personnalisés, un pour dessiner les lumières sur la cible de rendu d'éclairage (étape 4) et un autre pour dessiner la cible de rendu des tuiles sur l'écran à l'aide de la cible de rendu d'éclairage (étape 5).
Le shader utilisé au point 4 me permet d'ajouter (ce que j'appelle) une valeur de "luminosité". Cette valeur est float
multipliée par chaque pixel de la texture avant d'être ajoutée à la cible de rendu afin que je puisse essentiellement rendre les lumières plus claires ou plus sombres.
À ce stade, je prends également en compte la valeur "d'échelle" de la lumière, ce qui signifie que je peux avoir des lumières grandes ou petites en utilisant une seule texture.
Concernant le point 5:
Considérez la cible de rendu d'éclairage comme ayant essentiellement une valeur pour chaque pixel de 0 (noir) à 1 (blanc). Le shader multiplie essentiellement cette valeur par rapport aux valeurs RVB d'un pixel de la cible de rendu de tuile pour créer l'image dessinée finale.
J'ai également un peu plus de code ici où je passe (au shader) une valeur à utiliser comme couleur de superposition jour / nuit. Il est également multiplié par les valeurs RVB et inclus dans les calculs de cible de rendu d'éclairage.
Maintenant, cela ne vous permettra pas de faire des choses comme bloquer la lumière autour des objets et ainsi de suite, mais, au moins pour mes besoins, c'est simple et fonctionne bien.
J'ai écrit des articles de blog plus détaillés ici et ici qui peuvent vous aider. Je n'ai pas le temps pour le moment, mais si vous voulez, je peux aller plus en détail ici sur gamedev.
Oh, et voici un coup d'oeil dans mon éditeur de carte: