Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1433 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Shadow mapping en XNA

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Shadow mapping en XNA

n°2051136
oliviermdv​y
Posté le 23-01-2011 à 10:12:16  profilanswer
 

Salut,
 
voici le code HLSL tiré d'un exemple pour faire du shadow mapping
 
la partie la plus intéressante est :
 

Code :
  1. PS_OUTPUT RenderShadowsPS( PS_INPUT In )
  2. {
  3.     PS_OUTPUT Output;
  4.    
  5.     // Standard lighting equation
  6.     float4 vTotalLightDiffuse = float4(0,0,0,1);
  7.     float3 lightDir = normalize(g_LightPos-In.vPos);  // direction of light
  8.     vTotalLightDiffuse += g_LightDiffuse * max(0,dot(In.vNormal, lightDir));
  9.     vTotalLightDiffuse.a = 1.0f;
  10. // Now, consult the ShadowMap to see if we're in shadow
  11.     float4 lightingPosition
  12.  = GetPositionFromLight(In.vPos);// Get our position on the shadow map
  13.  
  14.     // Get the shadow map depth value for this pixel   
  15.     float2 ShadowTexC =
  16.  0.5 * lightingPosition.xy / lightingPosition.w + float2( 0.5, 0.5 );
  17.     ShadowTexC.y = 1.0f - ShadowTexC.y;
  18.     float shadowdepth = tex2D(ShadowMapSampler, ShadowTexC).r;   
  19.    
  20.     // Check our value against the depth value
  21.     float ourdepth = 1 - (lightingPosition.z / lightingPosition.w);
  22.    
  23.     // Check the shadowdepth against the depth of this pixel
  24.     // a fudge factor is added to account for floating-point error
  25. if (shadowdepth-0.03 > ourdepth)
  26. {
  27.     // we're in shadow, cut the light
  28.  vTotalLightDiffuse = float4(0,0,0,1);
  29. };
  30.     Output.RGBColor = tex2D(MeshTextureSampler, In.TextureUV) *
  31.  (vTotalLightDiffuse + g_LightAmbient);
  32.        
  33.     return Output;
  34.    
  35. }


 
Bon si j'ai bien compris le 'shadowdepth' est la distance enregistrée dans la shadow map pour la position de notre point à afficher et 'ourdeph' est la distance du point à afficher vue par la source lumineuse, là ou je pige pas c'est ce test :
 

Code :
  1. // Check the shadowdepth against the depth of this pixel
  2.     // a fudge factor is added to account for floating-point error
  3. if (shadowdepth-0.03 > ourdepth)
  4. {
  5.     // we're in shadow, cut the light
  6.  vTotalLightDiffuse = float4(0,0,0,1);
  7. };


 
si la distance enregistrée dans la shadow map est supérieure à celle calculée pour notre point à afficher alors le point est dans l'ombre... heuu je croyais que c'était le contraire ?  :heink:  
Normalement un point dont la distance est plus grande que celle enregistrée dans la shadow map est donc non visible de la source lumineuse et donc dans l'ombre.... et là c'est l'inverse... je comprends plus..  :cry:  
 
Y'aurait pas une bonne ame pour m'expliquer ? Ou alors donnez moi une référence d'un bon bouquin qui explique tout ça car je vais craquer là :)
Merci.


Message édité par oliviermdvy le 23-01-2011 à 10:12:42
mood
Publicité
Posté le 23-01-2011 à 10:12:16  profilanswer
 

n°2051349
oliviermdv​y
Posté le 24-01-2011 à 10:38:55  profilanswer
 

:bounce:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Shadow mapping en XNA

 

Sujets relatifs
Mapping avec Gtk.Algorithme de mapping
probleme IE - site EXTENSIBLE -- site d'archi[VBS] Problème avec le mapping
[XNA, HLSL][Résolu] Paramètres shader génériquesCustomiser le mapping entre namespaces et package générés
[Résolu][Hibernate] Mapping tricky entre 4 tablesXNA Game Studio
NHibernate mapping de Dictionary<MyClass, string>C++ et XNA
Plus de sujets relatifs à : Shadow mapping en XNA


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR