Shadow mapping en XNA

Shadow mapping en XNA - Divers - Programmation

Marsh Posté le 23-01-2011 à 10:12:16    

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
Reply

Marsh Posté le 23-01-2011 à 10:12:16   

Reply

Marsh Posté le 24-01-2011 à 10:38:55    

:bounce:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed