Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Shadow Maps

Iniciado por vincent, 07 de Marzo de 2005, 06:42:35 PM

« anterior - próximo »

vincent

 Muy buenas,

estoy intentando implementar unos shadow maps. Por ahora solo quiero grabar una textura con el shadow map para saber si lo hace bien.

Me estoy basando en un tutorial que linkeo pogacha en otro post (está en directx 8 ) y en el ejemplo que hay en la ayuda de directx. Por desgracia este ejemplo utiliza ps_2_0, cosa que yo no puedo hacer, pero para renderizar el shadow map no los utiliza, así que me tendria que bastar.

Os pasteo los pasos principales que hago, que creo que són correctos


// Inicialización


//Check for depth texture support
hr=d3d->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8,
       D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, D3DFMT_X8R8G8B8);
if(FAILED(hr))
{
 MessageBox(NULL, "Depth texture unsupported", NULL, NULL);
 return false;
}
//Create depth texture
hr=d3dDevice->CreateTexture(m_iShadowMapSize, m_iShadowMapSize, 1, D3DUSAGE_RENDERTARGET,
       D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &m_pShadowMapDepthTexture, NULL);
if(FAILED(hr))
{
 MessageBox(NULL, "Unable to create depth texture", NULL, NULL);
 return false;
}

 
//Get the top level of the shadow map depth texture
hr = d3dDevice->CreateDepthStencilSurface( m_iShadowMapSize, m_iShadowMapSize, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, TRUE, &m_pShadowMapDepthSurface, NULL);



// Dibujado



LPDIRECT3DSURFACE9 pOldRT = NULL;
   g_pd3dDevice->GetRenderTarget( 0, &pOldRT );
   LPDIRECT3DSURFACE9 pShadowSurf;
   if( SUCCEEDED( g_ShadowMapLight.getMapDepthTexture()->GetSurfaceLevel( 0, &pShadowSurf ) ) )
   {
       g_pd3dDevice->SetRenderTarget( 0, pShadowSurf );
       pShadowSurf->Release();
   }
   LPDIRECT3DSURFACE9 pOldDS = NULL;
   if( SUCCEEDED( g_pd3dDevice->GetDepthStencilSurface( &pOldDS ) ) )
       g_pd3dDevice->SetDepthStencilSurface( g_ShadowMapLight.getMapDepthSurface());

   {
 g_pd3dDevice->BeginScene();
  renderScene();
 g_pd3dDevice->EndScene();

   }

   if( pOldDS )
   {
       g_pd3dDevice->SetDepthStencilSurface( pOldDS );
       pOldDS->Release();
   }
   g_pd3dDevice->SetRenderTarget( 0, pOldRT );
pOldRT->Release();




// Guardado de textura a fichero


D3DXSaveTextureToFile( "./DepthMap.jpg", D3DXIFF_JPG, g_ShadowMapLight.getMapDepthTexture(), NULL);


El resultado de todo esto, es un churro de textura. Alguien me podria decir que hago mal.

Muchas gracias.

VinCenT
   
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Haddd

 
¿Qué es esto g_ShadowMapLight.getMapDepthTexture() ?


El Shadow Map se realiza de la siguiente forma:

1. Renderizar como si la cámara fuera la fuente de luz. Para ello se utiliza una matriz muy parecida a la de los proyectores spot.
2. El shader que se utiliza calcula la z en lightspace y lo guarda o bien en una textura R32F ( coma flotante, pero sólo 2.0 compatible) o bien en un A8R8G8B8 ( previa conversión de la z a este formato)
3. Renderizar la escena normalmente, pero comprobando si la z en light space es > que la z de la textura que acabamos de generar. Si es > significa que está en sombra.

Hay unas cuantas matrices aquí que deberías comprobar si están bien. Y piensa que sólo funcionan con Spot Lights, si quieres omni, tienes que utilizar un cube map o un spherical.


vincent

 Ok,

me lo miro con calma y os informo de mis avances.  :P

Merci!

VinCenT
Desarrollo en .Net y metodologías http://devnettips.blogspot.com






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.