Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Calques de lumières  (Lu 3446 fois)

0 Membres et 1 Invité sur ce sujet

CINEfilHD77

  • Newbie
  • *
  • Messages: 38
    • Voir le profil
Calques de lumières
« le: Août 14, 2014, 11:04:48 pm »
Saaaaalut à tous ! :D
Alors voilà, je bosse sur un moteur de jeu. En parallèle du développement de la partie Logique du moteur, je planche sur un système de lumières. Dans mes scènes (Ensemble de Noeuds de Scène), j'ai plusieurs calques, identifiés par leur hauteur (Idem z-index en CSS). Dans chaque calques, il peut y avoir des lumières. Ainsi, dans le processus d'affichage d'un calque, on dessine toutes les entités, et à la fin de l'affichage du-dit calque, on affiche les lumières, puis on passe au calque suivant. Or, j'ai essayé un truc inspiré de l'article de developpez.net (Moteur de lumières 2D avec SFML), c'est-à-dire :

J'ai une RenderTexture que je remplie de la couleur d'ambiance, puis je dessine chaque lumière en sf::BlendAdd dessus, puis je dessine la texture final en sf::BlendMultiply par dessus la scène.

Pour mon système de calques, j'avais essayé cet algo :

Pour chaque calque,
      Remplissage de la RenderTexture par la couleur ambiante.
      Pour chaque entité du calque,
            Si ce n'est pas une lumière, on l'affiche.
            Sinon, on ajoute la lumière en sf::BlendAdd dans la RenderTexture.
      Fin de l'affichage des entités du calque.
      Dessin de la RenderTexture des lumières en sf::BlendMultiply.
Fin de l'affichage du calque.

Le souci, c'est que vu qu'à chaque fois je dessine en multipliant, la RenderTexture des lumières, et bah la couleur ambiante se superpose et s'assombrie à mort...

Du coup, quelqu'un aurait-il une solution ? Peut-être avec des shaders, je sais pas trop... Merci d'avance !!! :)

P.S. : Ce forum c'est trop de la bombe !
P.S. 2 : Il n'y aura pas d'autre P.S. !
P.S. 3 : Ah si en fait...


Par décision de justice, il a été imposé à l'auteur de ce post d'exposer ses connaissances juridiques en matière de droits d'auteur. Vous me copierez cent fois :
(click to show/hide)
« Modifié: Août 18, 2014, 01:38:34 pm par CINEfilHD77 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Calques de lumières
« Réponse #1 le: Août 15, 2014, 09:30:47 am »
Normalement tu es censé avoir un seul calque pour toutes les lumières, il ne faut pas les mélanger aux calques des entités. Tu as une seule couleur d'ambiance et un jeu de plusieurs lumières d'un côté, ta scène de l'autre, et tu les mélanges tout à la fin.
Laurent Gomila - SFML developer

CINEfilHD77

  • Newbie
  • *
  • Messages: 38
    • Voir le profil
Re : Calques de lumières
« Réponse #2 le: Août 16, 2014, 10:56:41 pm »
D'accord, pour ça je suis d'accord, mais comment faire pour par gérer le fait, lors du dessin, que des entités peuvent être dessinées par-dessus des lumières, et d'autres dessous ? (Y'a des histoires de masking je crois mais je vois pas trop...) :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Calques de lumières
« Réponse #3 le: Août 17, 2014, 12:28:42 am »
Entités dessous
Lumières
Entités dessus

Tu dessines dans cet ordre et ça devrait aller, non ?
Laurent Gomila - SFML developer

CINEfilHD77

  • Newbie
  • *
  • Messages: 38
    • Voir le profil
Re : Calques de lumières
« Réponse #4 le: Août 17, 2014, 01:01:17 am »
Non justement :/ Parce que je peux avoir des choses plus complexes, par exemple (On va viser très loin) :
J'ai 10000 calques, et à chaque niveau, je peux avoir des lumières, genre :
Calque 0
Lumiere
Calque 1
Lumiere
Calque 2
Lumiere
Calque 3
Calque 4
Lumiere
[...]

Du coup là je n'ai pas juste un seul affichage des lumières de la scène...
J'avais pensé à utiliser une RenderTexture remplie de la couleur ambiante, et à chaque fois, je dessine en BlendAdd les lumières d'un calque, puis pour les entités des calques supérieurs, je dessine la silhouette de chaque entité en blanc sur la RenderTexture pour "couper" les lumières qui doivent se situer en-dessous, etc... Mais le truc c'est que si je dessine une silhouette en blanc sur la RenderTexture, et bah si je dois dessiner une lumière par dessus en BlendAdd, et bah la partie de celle-ci qui sera au dessus de la silhouette blanche sera invisible...

À moins qu'il y ai une autre méthode, pour l'instant je vois pas d'autre solution...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Calques de lumières
« Réponse #5 le: Août 17, 2014, 10:17:48 am »
Là je ne peux pas t'aider, il faudra sûrement sortir un algo beaucoup plus chiadé. Mais juste par curiosité, qu'est-ce que tu fais qui nécessite autant de calques de lumières superposés ?
Laurent Gomila - SFML developer

CINEfilHD77

  • Newbie
  • *
  • Messages: 38
    • Voir le profil
Re : Calques de lumières
« Réponse #6 le: Août 17, 2014, 08:26:16 pm »
Pour le coup des 1000 calques, c'est exagéré, mais c'est pour dire qu'on peut avoir un nombre de calques indéterminé. Imaginons par exemple qu'on a :

Un personnage, au sol.
Par dessus, un lampadaire (Avec sa lumière, en partie masquée par le support de l'ampoule).
Par dessus, un hélicoptère.
Sur les pales de l'hélicoptère, une LED.

Vous voyez que dans cette situation, on a plusieurs calques de lumières, dont certains ont des lumières en partie cachées par d'autres entités, mais on peut très bien avoir d'autres situations avec plus ou moins de superpositions...

Merci quand même pour les réponses rapides ! :)

CINEfilHD77

  • Newbie
  • *
  • Messages: 38
    • Voir le profil
Re : Calques de lumières
« Réponse #7 le: Août 20, 2014, 01:17:42 pm »
J'ai enfin trouvé ! :D
Voila ce que je fais (Je sais pas si c'est très optimisé, mais bon) :
Pour chaque calque, je dessine ses entités.
En même temps, je dessine dans la RenderTexture des lumières, via un shader, leur silhouette (Remplie de la couleur ambiante, pour "effacer" ce qui se trouve en dessous).
Puis je dessine, toujours dans la RenderTexture, les lumières du calque.
Une fois tous les calques traités, je dessine en BlendMultiply la RenderTexture des lumières, et Paf! ça fait ce que je veux !
(Je tiens à remercier les éclairs de réflexion nocturnes ! :P

TheKingArthur

  • Invité
Re : Calques de lumières
« Réponse #8 le: Août 20, 2014, 04:25:42 pm »
Bonne idée je n'y aurai pas penser tout seul.
Je l'utiliserai si j'en besoin.