今天終于把模型導出插件最基本的功能--導出網格給寫好了。
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/