Author Topic: Shadow mapping  (Read 3676 times)

0 Members and 1 Guest are viewing this topic.

Offline xtrium

  • Base
    • Pouet.net
    • Coup de coeur
    • Slengpung
    • View Profile
    • Homepage Frequency
  • Ancienneté: 2007
  • Groupe: Frequency
  • Rôle: Coder, musicien
  • Ville: Lille
Shadow mapping
« on: 11 March 2012 à 13:21:03 »
Salutatous ! :)

Comme l'indique le titre du topic, je suis en mode prise de tête sur les shadowmaps depuis quelques jours, un truc doit probablement m'échapper, donc je viens requérir votre avis éclairé :p

J'explique où j'en suis. J'ai des spot lights, que je voudrais voir projeter des ombres. J'ai donc, après lecture sur le sujet,  compris les étapes suivantes :
1. Je me place en point de vue spotlight, je génère une depth map - et ça, pour chaque spot, mais parlons d'un seul pour commencer :D
2. Je reviens en point de vue caméra, et je fais le rendu de ma scène (chez moi, deferred shading, donc je colle tout le bazar dans un gbuffer)
3. J'en arrive à la passe de lighting. Et là, je peux avoir sans aucun souci la position de chaque pixel dans l'espace light, et donc le Z correspondant, mais...

Voilà donc ma question : Comment suis-je supposé savoir à quel pixel de la depthmap originale comparer la depth du fragment considéré ? Je me doute que je prends le problème par le mauvais bout, mais bon... Je me vois difficilement appliquer toute la transfo view/projection de la light à chaque fragment à traiter :/

Une idée, une solution, une subite envie de me faire manger mon clavier ? Vous êtes les bienvenus :p
Merci d'avance !

-xtrium

Offline Zavie

Re : Shadow mapping
« Reply #1 on: 11 March 2012 à 16:19:52 »
Je n'ai pas encore essayé le deferred shading, mais en forward rendering classique, tu calcules simplement les coordonnées de textures par sommet en faisant une projection avec la matrice qui t'a servi à générer la shadow map, et récupères donc cette information dans le fragment shader sous la forme d'un simple attribut.

Ça ne semble pas tellement intéressant de maintenir cette information jusqu'au G-buffer, surtout si tu as plusieurs lumières (n x 2 coordonnées de texture dans le G-buffer, youpi !). Il me semble que dans l'industrie la plupart du temps il n'y a qu'une ombre, et le résultat de l'ombrage est stocké dans le G buffer en un octet.

Pour plusieurs lumières je suppose qu'il n'y a pas le choix, il faut faire plusieurs passes. Pour chacune, rendre de la scène avec seulement l'ombre, combiner, passer à la lumière suivante.

@lx, un retour d'expérience à partager ?
« Last Edit: 11 March 2012 à 16:23:52 by Zavie »

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Shadow mapping
« Reply #2 on: 11 March 2012 à 17:38:50 »
Voui je confirme : t'as pas bien le choix que de te taper (Proj => View => World => Light => LightProj) (en 1 seule matrice, on est d'accord) pour chaque pixel...
Si tu fais pas de soft shadowing, tu peux "accélérer" en écrivant dans le stencil quand t'as une ombre et en rejetant les pixels déjà ombrés...
« Last Edit: 11 March 2012 à 17:42:28 by Patapom »
.  Pom  .

Offline xoofx

  • Base
    • Pouet.net
    • View Profile
    • xoofx
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: code (+musique), web
  • Ville: Grenoble
Re : Shadow mapping
« Reply #3 on: 11 March 2012 à 23:55:16 »
Salut xtrium!
En deferred shading - tout comme en forward - comme le suggères Zavie, on calcule effectivement la depth en "light space" pour chaque vertex (dans le vertex shader donc) et on utilise la depth interpolée dans le pixel shader, la ou il n'y a plus qu'a la comparer avec la depth récupérée de la shadow map. C'est le meme principe pour un simple shadowmap qu'avec un cascade shadowmap.
Après, dans ton first-pass, tu peux uniquement stocker dans un channel d'une render target la quantité de shadowmap de 0.0 a 1.0 et la réutiliser dans la pass de composition finale. Et oui, comme dit Patapom, si t'as pas besoin de soft shadow, tu peux juste utiliser le stencil pour ca...
En deferred lighting, on ne calcule/compose les shadowmap que dans la pass de composition et non pas dans le light-prepass, donc le problème est plus simple (on n'a pas besoin de stocker temporairement un shadow factor) mais sinon, dans le principe, on calcule la même chose pour les shadowmap.

Offline xtrium

  • Base
    • Pouet.net
    • Coup de coeur
    • Slengpung
    • View Profile
    • Homepage Frequency
  • Ancienneté: 2007
  • Groupe: Frequency
  • Rôle: Coder, musicien
  • Ville: Lille
Re : Shadow mapping
« Reply #4 on: 14 March 2012 à 14:26:04 »
Salut les gens, et merci pour les conseils ! :)

J'ai fini par réussir à m'en sortir, et ça marche plutôt bien, voyez vous-même :D



L'étape suivante, c'est le PCSS, mais j'vais avoir besoin de lire pour ça. Et donc, ça passera après le post-processing, pour avoir le temps de me documenter un peu. J'en profite que si vous vous sentez l'âme généreuse et êtes ok pour m'expliquer le principe du PCSS, je prends :p

Offline RaHoW

  • Base
    • Pouet.net
    • View Profile
    • Apex - official site
  • Ancienneté: 1993
  • Groupe: Apex
  • Rôle: Gfx, code, orga
Re : Shadow mapping
« Reply #5 on: 14 March 2012 à 19:09:59 »
yehhhh
=RaHoW/Apex=