Bonjour tout le monde,

Je vous expose vite fait le problème. Je suis débutant en openGL, j'utilise slick (donc 2D, java et lwjgl). Je réfléchis (plus que de coder pour le moment) sur la manière d'implémenter un système d'ombrage pour mon jeu. L'idée est toute simple mais la réalisation me pose problème (j'espère que ce sera évident pour au moins un de vous ^^).

C'est un jeu en vue objective par dessus, comme GTA 1-2, ou le très bon left 4k dead (http://www.mojang.com/notch/j4k/l4kd/), donc des plans réellement en 2D, sans volume ni effet trompeur etc. L'idée serait d'arriver à ce qu'a réussi l'auteur de left 4k dead en version opengl, en version simplifiée pour commencer.

Pour le moment je fais ainsi :
=> dans le stencil buffer
- dessiner un rectangle couvrant toute la zone (add)
- dessiner la lumière de ma lampe torche (decr)
- dessiner les ombres portées de chaque objets par rapport à ma lampe (add)

ainsi dans mon stencil buffer j'obtiens les endroits où je dois colorer en "ombre".



Voila ce que ça donne pour le moment.
On voit en jaune la version debug pour les ombres portées (à améliorer encore) (le moteur de base provient de Shade)

Ce que j'aimerais pouvoir faire maintenant :
- ne pas colorer les objets qui ne sont pas visible (les carrés et rond verts)
- pouvoir avoir plusieurs source de lumières (par exemple mettre 2 points rapprochés pour simuler des soft shadows)
- savoir comment mettre des ombres de couleur pour mes objets, car le stencil n'accepte pas ça je crois (uniquement 0 ou 1 ?) afin de pouvoir dessiner des vitres qui renverraient simplement une ombre de couleur en fonction du type de verre (en théorie très simple...)
- pouvoir dessiner directement une image à la place de construire une forme pour simuler la lampe (moche pour le moment)
- avoir une architecture de rendu "intelligente", quand est-ce qu'il faut dessiner le background, les objets, les ombres, les lumières, etc...


Pour le moment l'architecture c'est comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
  renderLights();
  renderBackgrounds();
  renderEntities();
  renderTimeOfDay();
J'espère que cette petite description vous parlera un peu voire beaucoup

Merci d'avance
A tout bientôt

Wadeck

edit: j'ai vu que pour left 4k dead, il avait effectuer un calcul pour chaque pixel "a la main" alors non merci mais l'effet résultant est celui que je cherche
edit2: y aurait-il une voie de résolution en dessinant la scène normalement puis dessiner les lumières + ombres à l'aide d'une blendfunc (on ferait une sorte de masque d'alpha en fonction des lumières). Mais dans ce cas, il faudrait que seules les parties sous la lumière soit affiché et donc que l'on dessine soit un rectangle englobant la scène ou alors on inverse les alpha dans le calcul... fin c'est une voie à prendre en compte peut-être

gros edit 3 :
Autre solution en théorie viable mais après en pratique aucune idée ^^
tout en blending éteint :
1) On dessine le fond noir => pour donner le ton là où ni ombre ni lumière ne parviennent
2) On dessine les lumières => les lumières écrasent le noir d'avant avec leur blanc (ça donne la possibilité d'employer des textures comme lumières
3) On dessine les ombres portées => les ombres écrasent les lumières mais empêchent l'utilisation d'ombre portée de plus basse coloration telle que des ombres portées depuis des vitres. Peut être résolu avec un glBlendFunc(DST_ALPHA, ONE) comme ça les ombres sont dessinées sans problème quand elles sont purement noire ( alpha = 1) et la lumière reste un peu visible lorsque c'est une ombre de faible intensité (alpha < 1) telle celle d'une vitre
4) On lance le rendering de la scène en mettant glBlendFunc(DST_ALPHA, ONE_MINUS_DST_ALPHA) pour que la lumière permette de dessiner au ratio de son intensité et en cas d'ombre, rien n'est changé (pour une ombre colorée (genre derrière un vitrail), l'objet deviendra légèrement orangé.
Pour le moment cette technique parait en théorie l'idéal pour moi, est-ce qu'elle passera le test du codage... réponse d'ici 2-3 jours j'espère

edit4: résultat après avoir tenter la technique de l'edit3 :

Ce qui est très encourageant en fait, mais je dois encore réfléchir pour mettre la couleur en fonction du moment de la journée ou de la nuit... suite au prochain épisode