D3D设备丢失解释

 

在创建时使用D3DPOOL_MANAGED标志的资源可以不需要重新载入,但D3DPOOL_DEFAULT加载的资源就需要先释放,后 重建。

通常需要这样处理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
在发现设备丢失时,我们要调用 OnLostDevice(void)函数让D3DPOOL_DEFAULT加载的资源释放掉。
好在ID3DXFont和ID3DXSprite有设备丢失处理函数,直接调用就好了

void  OnLostDevice( void )
{
    m_sprite -> OnLostDevice();
    m_font -> OnLostDevice();
}


可是,怎么知道设备丢失了呢?
如果设备丢失,Present()函数就会“出问题”,返回值是D3DERR_DEVICELOST。

m_pIDirect3DDevice -> EndScene();

HRESULT hr;
hr 
=  m_pIDirect3DDevice -> Present(NULL, NULL, NULL, NULL);
if (hr  ==  D3DERR_DEVICELOST)
{
if (m_pIDirect3DDevice -> TestCooperativeLevel()  ==  D3DERR_DEVICENOTRESET)
{
OnLostDevice();
OnResetDevice();
}
}

TestCooperativeLevel()== D3DERR_DEVICENOTRESET 时,就可以恢复设备了。
于是,我们调用
OnLostDevice()让D3DPOOL_DEFAULT加载的资源释放掉,之后,调用OnResetDevice()来恢复设备就可以了。

怎么恢复设备呢?
ID3DXFont和ID3DXSprite的恢复函数,最后,需要把D3D设备中的状态啊,矩阵变换啊这些重新设置下就完成了,也就是调用InitDevice()。

void  OnResetDevice( void )
{
if (FAILED(m_pIDirect3DDevice -> Reset( & d3dpp)))
{
return ;
}

m_sprite
-> OnResetDevice();
m_font
-> OnResetDevice();

InitDevice();
}

先让D3D设备reset,然后调用

void  InitDevice()
{
m_pIDirect3DDevice
-> SetRenderState( D3DRS_ZENABLE, TRUE );

m_pIDirect3DDevice
-> SetRenderState( D3DRS_AMBIENT,  0xffffffff  );

m_pIDirect3DDevice
-> SetSamplerState( 0 , D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pIDirect3DDevice
-> SetSamplerState( 0 , D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pIDirect3DDevice
-> SetSamplerState( 0 , D3DSAMP_MIPFILTER, D3DTEXF_POINT);

D3DXMatrixPerspectiveFovLH( 
& matProj, D3DX_PI / 4 1.0f 1.0f 1000.0f  );
m_pIDirect3DDevice
-> SetTransform( D3DTS_PROJECTION,  & matProj );

vEyeVec
= D3DXVECTOR3( 0.0f , 0.0f , - 1.0f );
vLookatVec
= D3DXVECTOR3( 0.0f , 0.0f , 0.0f );
vUpVec
= D3DXVECTOR3( 0.0f , 1.0f , 0.0f );
D3DXMatrixLookAtLH( 
& matView,  & vEyeVec,  & vLookatVec,  & vUpVec );
m_pIDirect3DDevice
-> SetTransform( D3DTS_VIEW,  & matView );

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值