今天终于把模型导出插件最基本的功能--导出网格给写好了。
c++和max sdk一起用的感觉很怪,系统崩溃了N次,不过,总算能导出网格了~
有图有真相,截图纪念
(注意:模型是从value的csol中弄出来的)
在d3d中渲染导出的模型
在d3d中渲染导出的模型
我的模型导出插件
导出数据样本:
[这是一个带贴图的立方体的导出数据]
8// 8个顶点
-6.70302 -21.2068 -5.46039
17.1883 -6.46757 0.162097
-22.4049 2.22378 -0.162097
1.48644 16.963 5.46039
-8.48039 -28.3257 20.7542
15.411 -13.5865 26.3767
-24.1823 -4.89514 26.0525
-0.290929 9.84411 31.675
12// 12个纹理坐标
0 1 0
1 1 0
0 0 0
1 0 0
0 1 0
1 1 0
0 0 0
1 0 0
0 1 0
1 1 0
0 0 0
1 0 0
12// 12个面引索
0 9 2 11 3 10
3 10 1 8 0 9
4 8 5 9 7 11
7 11 6 10 4 8
0 4 1 5 5 7
5 7 4 6 0 4
1 0 3 1 7 3
7 3 5 2 1 0
3 4 2 5 6 7
6 7 7 6 3 4
2 0 0 1 4 3
4 3 6 2 2 0
低手交流,高手勿入
当初觉得DX中设备丢失很讨厌,差点就投奔OpenGL了。
不过现在发现其实也没那么麻烦啦,写点东西,给不清楚
设备丢失怎么处理的同学参考下。
在创建时使用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()来恢复设备就可以了。
怎么恢复设备呢?
void OnResetDevice(void)
{
if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
{
return;
}
m_sprite->OnResetDevice();
m_font->OnResetDevice();
InitDevice();
}
先让D3D设备reset,然后调用ID3DXFont和ID3DXSprite的恢复函数,最后,需要把
D3D设备中的状态啊,矩阵变换啊这些重新设置下就完成了,也就是调用InitDevice()。
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 );
}
啊,这样设备丢失就处理好了
//
tag:DirectX 3D d3d lost device TestCooperativeLevel OnLostDevice 恢复设备 设备丢失 DeviceLost
发现有了Irrlicht+IrrNewt+IrrKlang ,3d编程就无敌了。。
简介一下
1.Irrlicht
Irrlicht在开源3d引擎里算很好的一个,
而且它是LGPL( Lesser General Public License)协议的,你可以随意使用它。
主页:
http://irrlicht.sourceforge.net/
2.IrrNewt
IrrNewt是把Newton dynamic(一个物理引擎)和Irrlicht(3d图形引擎)结合的一个库,
用了它的确会让游戏效果很震撼。
主页:
http://aresfps.sourceforge.net/irrnewt.htm
3.IrrKlang
它是为Irrlicht设计的声音引擎,支持3d和2d声效。
主页:
http://www.ambiera.com/irrklang/