又系学习笔记
这个是针对给自己看的,所以可能很多地方不会说得太明白.
创建rendertarget
pd3dDevice->CreateTexture( ShadowMap_SIZE, ShadowMap_SIZE,
1, D3DUSAGE_RENDERTARGET,
D3DFMT_R32F,
D3DPOOL_DEFAULT,
&g_pShadowMap,
NULL )
创建depthstencil
pd3dDevice->CreateDepthStencilSurface( ShadowMap_SIZE,
ShadowMap_SIZE,
d3dSettings.pp.AutoDepthStencilFormat,
D3DMULTISAMPLE_NONE,
0,
TRUE,
&g_pDSShadow,
NULL )
下面是它们使用及接口管理:
LPDIRECT3DSURFACE9 pOldRT = NULL;
V( pd3dDevice->GetRenderTarget( 0, &pOldRT ) );//这里要注意,接口每进行一次GET操作 ADDREF就会调用一次,所以,必须注意RELEASE的使用.
LPDIRECT3DSURFACE9 pShadowSurf;
if( SUCCEEDED( g_pShadowMap->GetSurfaceLevel( 0, &pShadowSurf ) ) )
{
pd3dDevice->SetRenderTarget( 0, pShadowSurf );
SAFE_RELEASE( pShadowSurf ); //这里就是因为前面的GET的操作,所以需要调用一次RELEASE,对管理数目进行减一的操作,要注意,当管理数目不为0时,设备接口是不会进行其内存的释放的.所以此时pShadowSurf原来指向的内存区域依然可以使用,也就是说g_pShadowMap就是下次渲染的目标.
}
LPDIRECT3DSURFACE9 pOldDS = NULL;
if( SUCCEEDED( pd3dDevice->GetDepthStencilSurface( &pOldDS ) ) )
pd3dDevice->SetDepthStencilSurface( g_pDSShadow );
{
CDXUTPerfEventGenerator g( DXUT_PERFEVENTCOLOR, L"Shadow Map" );
RenderScene( pd3dDevice, true, fElapsedTime, &mLightView, &g_mShadowProj );//对g_pShadowMap进行渲染.
}
if( pOldDS )
{
pd3dDevice->SetDepthStencilSurface( pOldDS );
pOldDS->Release(); //这里也是因为GET操作.
}
pd3dDevice->SetRenderTarget( 0, pOldRT );
SAFE_RELEASE( pOldRT );