Comment puis-je implémenter des ombres 2D projetées entre les couches?

10

Comment puis-je implémenter des ombres 2d projetées par des objets dans un calque différent?

PAS comme l'éclairage dynamique dans le tutoriel bien connu de Catalin Zima :

entrez la description de l'image ici

Mais comme les ombres des tuyaux dans cette vidéo :

entrez la description de l'image ici

Et comme l'ombre de la plateforme et du personnage dans cette vidéo :

entrez la description de l'image ici

Je voudrais utiliser le même type d'éclairage dans une scène avec plusieurs couches et beaucoup de lumières avec des couleurs différentes.

Je pourrais imaginer faire cela en dessinant une copie noire du calque sur les calques derrière ce calque et en l'ajustant en fonction des trous dans les calques sur lesquels l'ombre est projetée. Mais j'espère qu'il existe une approche moins coûteuse, basée sur un pixel shader.

Baie
la source

Réponses:

1

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.

Sean Middleditch
la source
Oui, c'est exactement ce que j'ai trouvé moi-même. Je ne connaissais pas le terme correct car c'était un masque. Mais j'espérais qu'il y aurait peut-être un algorithme plus similaire à la façon dont les volumes d'ombres fonctionnent dans l'espace 3D ..
Berry
Lorsque vous projetez des ombres sur des surfaces avec des trous, vous devez projeter l'ombre résidente sur le calque derrière celui-ci. De plus, travailler avec la transparence deviendra un peu délicat. J'ai déjà pensé à toutes les solutions à ces problèmes! Mais je pensais que ça deviendrait trop cher à appliquer en temps réel, surtout quand il s'agit de beaucoup de couches (20) et de beaucoup de lumières (50). C'est pourquoi j'espérais une approche différente.
Berry