Cela peut être fait avec du masquage. Il existe plusieurs façons de procéder.
Une façon serait d'avoir un moyen de rendre une version fantôme des éléments de premier plan. Dessinez l'arrière-plan. Dessinez ensuite les éléments de premier plan, légèrement décalés en fonction de la façon dont vous souhaitez que l'éclairage se déplace, de telle sorte que vous ne produisiez que des couleurs noires. Dessinez ensuite le premier plan normalement.
Une autre façon serait de rendre le premier plan dans un tampon, un peu plus que ce que vous verriez réellement. Faites ensuite une passe "au noir" et peut-être une passe floue. Rendez maintenant la sortie de cet ensemble de passes, puis la section visible du tampon de premier plan.
Pour prendre en charge plusieurs lumières sous différents angles, vous pouvez simplement effectuer l'étape précédente plusieurs fois ou les accumuler toutes dans un seul tampon. Les calculs varient en fonction de ce que vous essayez de réaliser, mais une première supposition sur ce qui se passe dans cette première vidéo est qu'ils prennent simplement la position de la lumière par rapport à la position de la caméra (centre de la zone visible) et puis utilisez ce vecteur (mis à l'échelle) pour déterminer comment compenser les ombres. Quelque chose comme:
draw background
for each light intersecting viewing bounds:
offset = light.position - camera.position
offset *= SCALE FACTOR (0.25 maybe)
draw shadow foreground at offset
draw foreground
Les lumières qui sont "plus proches" de la scène auront un facteur d'échelle plus petit. Si vous voulez plusieurs profondeurs, il y a des maths à travailler, des trucs géométriques simples.