Bon bin deja la théorie
Ca c’est pour la culture generale
De base la Lumière est une equation recursive.
La lumiere observé en un point X est egale a la lumiere emise de ce point X et la somme de la lumiere venant de tous les points visible depuis ce point X.
Si tu veux l’equation sous sa forme complete (j’ai deja simplifié l’explication), elle est disponible ici : https://en.wikipedia.org/wiki/Rendering_equation (ca vaut le coup d’oeil )
Soit dit en passant, si on applique cette equation a la lettre pour faire du calcule de lumiere en temps reel, on met a genoux meme les supercalculateurs. Donc on approxime beaucoups.
principe general de Penumbra
Quand tu appele Penumbra.BeginDraw, dans ta fonction Draw :
This will swap the render target to a custom texture so that the generated lightmap can be blended atop of it once PenumbraComponent is drawn.
Ca redirige tout les rendu vers une texture personnalisé, probalement contenu dans le composant penumbra.
Cela lui permet lorsqu’il arrive au dessin de son composant penumbra, de faire des cumul de calques entre :
- Ce qui est rendu normalement (sans calcul de lumiere)
- Les differentes lumieres qui viennent montrer/masquer les zones du calque precedent (un calque par lumiere)
puis afficher le resultat dans un sprite sur l’ecran, qui prend tout l’ecran.
generation d’un calque de lumiere
Pour générer les calques de lumiere, je suppose qu’il fait des mesh.
Dans son code, il a une structure nommé Vao. Vertex Array Object => un Mesh quoi. Il a egalement des rectangle englobant (boundingRectangle), Avec de telles structures, moi je ferais du lancer de rayon, selon le type de lumiere a angle plus ou moins grand et restraint par la portée de la lumiere.
Et generer un mesh de zone eclairé avec ca.
Pour cela, tu met ton rectangle englobant sur les object qui doivent projeter une ombre et le mesh de la lumiere viens s’arreter contre.
Apres y a une projection dans l’espace 2D (la c’est du calcul matriciel que j’ai jamais vraiment maitrisé…)
A partir de la, on a le calque associé a la lumiere.
On prend les pixels interressant sur l’image de lumiere pour avoir le dégradé, le reste etant dans l’ombre reste noir.
Cela donne les images qu’il montre, il en presente 3, pour 3 gestion differente, cela depend de comment on veux traiter/afficher les objet bloquant la lumiere.
conclusion
J’espere avoir ete clair dans mes explications. Et ne pas m’etre trompé.
(c’est pas impossible, j’ai pas tout decortiqué et je ne peux pas tester, je tourne sous linux et il utilise DirectX pour les shaders d’apres son readme, et j’ai pas envie d’apprendre monogame.)
Donc tu n’aura pas d’exemple d’implementation de ma part. Mais il en fourni 3 dans le dossir sample.
La technique que j’explique pour generer les calques de lumiere, fonctionne, mais je ne suis pas convaincu vis a vis des temps de calcul donc il est possible qu’il ne fasse absolument pas comme ca…
Si quelqu’un voit une erreur, qu’il me corrige.