今天終于把模型導(dǎo)出插件最基本的功能--導(dǎo)出網(wǎng)格給寫好了。
c++和max sdk一起用的感覺很怪,系統(tǒng)崩潰了N次,不過,總算能導(dǎo)出網(wǎng)格了~
?
有圖有真相,截圖紀(jì)念
(注意:模型是從value的csol中弄出來的)
在d3d中渲染導(dǎo)出的模型-
在d3d中渲染導(dǎo)出的模型-
我的模型導(dǎo)出插件-
導(dǎo)出數(shù)據(jù)樣本:
[這是一個帶貼圖的立方體的導(dǎo)出數(shù)據(jù)]
?
8// 8個頂點(diǎn)
-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個紋理坐標(biāo)
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
低手交流,高手勿入
當(dāng)初覺得DX中設(shè)備丟失很討厭,差點(diǎn)就投奔OpenGL了。
不過現(xiàn)在發(fā)現(xiàn)其實(shí)也沒那么麻煩啦,寫點(diǎn)東西,給不清楚
設(shè)備丟失怎么處理的同學(xué)參考下。
在創(chuàng)建時使用D3DPOOL_MANAGED標(biāo)志的資源可以不需要重新載入,但D3DPOOL_DEFAULT加載的資源就需要先釋放,后重建。
通常需要這樣處理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
在發(fā)現(xiàn)設(shè)備丟失時,我們要調(diào)用 OnLostDevice(void)函數(shù)讓D3DPOOL_DEFAULT加載的資源釋放掉。
好在ID3DXFont和ID3DXSprite有設(shè)備丟失處理函數(shù),直接調(diào)用就好了
void?OnLostDevice(void)
{
??? m_sprite->OnLostDevice();
????m_font->OnLostDevice();
}
可是,怎么知道設(shè)備丟失了呢?
如果設(shè)備丟失,Present()函數(shù)就會“出問題”,返回值是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時,就可以恢復(fù)設(shè)備了。
于是,我們調(diào)用OnLostDevice()讓D3DPOOL_DEFAULT加載的資源釋放掉,之后,調(diào)用
OnResetDevice()來恢復(fù)設(shè)備就可以了。
怎么恢復(fù)設(shè)備呢?
void?OnResetDevice(void)
{
????if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
????{
????????return;
????}
????m_sprite->OnResetDevice();
????m_font->OnResetDevice();
????InitDevice();
}
先讓D3D設(shè)備reset,然后調(diào)用ID3DXFont和ID3DXSprite的恢復(fù)函數(shù),最后,需要把
D3D設(shè)備中的狀態(tài)啊,矩陣變換啊這些重新設(shè)置下就完成了,也就是調(diào)用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?);
}
啊,這樣設(shè)備丟失就處理好了
//
tag:DirectX 3D? d3d lost device TestCooperativeLevel OnLostDevice 恢復(fù)設(shè)備 設(shè)備丟失 DeviceLost
發(fā)現(xiàn)有了Irrlicht+IrrNewt+IrrKlang ,3d編程就無敵了。。
簡介一下
1.Irrlicht
Irrlicht在開源3d引擎里算很好的一個,
而且它是LGPL( Lesser General Public License)協(xié)議的,你可以隨意使用它。
主頁:
http://irrlicht.sourceforge.net/
2.IrrNewt
IrrNewt是把Newton dynamic(一個物理引擎)和Irrlicht(3d圖形引擎)結(jié)合的一個庫,
用了它的確會讓游戲效果很震撼。
主頁:
http://aresfps.sourceforge.net/irrnewt.htm
3.IrrKlang
它是為Irrlicht設(shè)計的聲音引擎,支持3d和2d聲效。
主頁:
http://www.ambiera.com/irrklang/