3D遊戲從入門到精通 11

2021-04-08 22:49:30 字數 4096 閱讀 8761

2.10.1

索引緩衝區

上面已經學習了最簡單的三角形顯示,了解了整個3d物體的顯示流程,下面來學習乙個複雜一點的物體顯示,使用12個三角形構造成的正方體顯示。並且通過個例子學會使用索引緩衝區,提高圖形繪製的速度和效率。 1、

使用三角形構造立方體

由前面可知,任何複雜的物體,都是由三角形組成的。現在就用12三角形構造乙個正方體。先建立12點個頂點的緩衝區,然後再往裡填寫合適的資料,然後顯示它出來。下面來仔細分析這段**:

在函式hresult ccaicube::init(idirect3ddevice9* pd3ddevice)裡,先建立12頂點資料。

const int nvtcount = 6*2*3;

// 建立頂點緩衝區。

if( failed( hr = m_pd3ddevice->createvertexbuffer( nvtcount * sizeof(vt_caicube),

0, vt_caicube::dwfvf,

d3dpool_managed, &m_pvb, null ) ) )

這段**,跟以前的**一樣建立頂點緩衝區。

接著下來就指明所有三角形的座標:

// 用三角形填充頂點緩衝區。

vt_caicube* pvertices;

if( failed( hr = m_pvb->lock( 0, 0, (void**)&pvertices, 0 ) ) )

// 三角形組成的立方體表面。

//第乙個面

pvertices[0].vposition = d3dxvector3( -1.0f, -1.0f, -1.0f ); 

pvertices[1].vposition = d3dxvector3( -1.0f, 1.0f, -1.0f ); 

pvertices[2].vposition = d3dxvector3( 1.0f, 1.0f, -1.0f ); //

pvertices[3].vposition = d3dxvector3( -1.0f, -1.0f, -1.0f ); 

pvertices[4].vposition = d3dxvector3( 1.0f, 1.0f, -1.0f );

pvertices[5].vposition = d3dxvector3( 1.0f, -1.0f, -1.0f );

//第二個面

pvertices[6].vposition = d3dxvector3( -1.0f, 1.0f, -1.0f ); 

pvertices[7].vposition = d3dxvector3( -1.0f, 1.0f, 1.0f ); 

pvertices[8].vposition = d3dxvector3( 1.0f, 1.0f, -1.0f ); //

pvertices[9].vposition = d3dxvector3(   -1.0f, 1.0f, 1.0f );

pvertices[10].vposition = d3dxvector3( 1.0f, 1.0f, 1.0f );

pvertices[11].vposition = d3dxvector3( 1.0f, 1.0f, -1.0f );

//第三個面

pvertices[12].vposition = d3dxvector3( -1.0f, 1.0f, 1.0f );

pvertices[13].vposition = d3dxvector3( -1.0f, -1.0f, 1.0f );

pvertices[14].vposition = d3dxvector3( 1.0f, 1.0f, 1.0f ); //

pvertices[15].vposition = d3dxvector3( 1.0f, 1.0f, 1.0f );

pvertices[16].vposition = d3dxvector3( -1.0f, -1.0f, 1.0f );

pvertices[17].vposition = d3dxvector3( 1.0f, -1.0f, 1.0f );

//第四個面

pvertices[18].vposition = d3dxvector3( -1.0f, -1.0f, 1.0f );

pvertices[19].vposition = d3dxvector3( 1.0f, -1.0f, -1.0f );

pvertices[20].vposition = d3dxvector3( 1.0f, -1.0f, 1.0f ); //

pvertices[21].vposition = d3dxvector3( -1.0f, -1.0f, 1.0f );   

pvertices[22].vposition = d3dxvector3( -1.0f, -1.0f, -1.0f );

pvertices[23].vposition = d3dxvector3( 1.0f, -1.0f, -1.0f );

//第五個面

pvertices[24].vposition = d3dxvector3( 1.0f, 1.0f, 1.0f );   

pvertices[25].vposition = d3dxvector3( 1.0f, -1.0f, -1.0f );

pvertices[26].vposition = d3dxvector3( 1.0f, 1.0f, -1.0f ); //

pvertices[27].vposition = d3dxvector3( 1.0f, -1.0f, -1.0f );   

pvertices[28].vposition = d3dxvector3( 1.0f, 1.0f, 1.0f );

pvertices[29].vposition = d3dxvector3( 1.0f, -1.0f, 1.0f );

//第六個面

pvertices[30].vposition = d3dxvector3( -1.0f, 1.0f, -1.0f );

pvertices[31].vposition = d3dxvector3( -1.0f, -1.0f, -1.0f );    

pvertices[32].vposition = d3dxvector3( -1.0f, 1.0f, 1.0f ); //

pvertices[33].vposition = d3dxvector3( -1.0f, 1.0f, 1.0f );    

pvertices[34].vposition = d3dxvector3( -1.0f, -1.0f, -1.0f );

pvertices[35].vposition = d3dxvector3( -1.0f, -1.0f, 1.0f );

//解鎖頂點緩衝區。

m_pvb->unlock();

上面從第乙個面開始,就每個面兩個三角形地填寫,並且是按左中手座標系的方向來填寫三角形的頂點。

接著修改渲染的**,改為渲染12個三角形,**如下:

// 渲染頂點緩衝區的內容。

m_pd3ddevice->setstreamsource( 0, m_pvb, 0, sizeof(vt_caicube) );

m_pd3ddevice->setfvf( vt_caicube::dwfvf );

m_pd3ddevice->drawprimitive( d3dpt_********list, 0, 12 );

這樣顯示出來的立方體是那個面都可以看得到的,如果不按左手座標系填寫,就會有一些面看不到的。

通過上面的**,是否看到要顯示乙個簡單的立方體,就需要複雜地填寫頂點了,並且要小心翼翼地寫**,一不小心寫錯了,就看不見了。因此,再複雜的物體,一般是通過使用3d建模軟體來構造的。通過上面的**,也發現了乙個問題,就是整個正方體,其實只有8個頂點,而上面的三角形列表裡有很多頂點是重複的,對於只有12個三角形來說,也許不是很重要。但是對於數以萬計的三角形來說,這樣的重複頂點就會浪費很多記憶體,浪費系統的頻寬,並且需要重複渲染頂點。有沒有更好的方法來解決這個問題呢?答案是肯定的,下面接著就來學習索引緩衝區。

本電子書、

mm3d

引擎源程式

、例子源程式共

49 元一套

聯絡人:蔡軍生

****:

email: caimouse1976 at sina.com

3D遊戲從入門到精通 31

當我們看到現實世界裡,有很多山地。那麼這種山地,在 3d世界裡又是怎麼樣顯示出來的呢?要模擬現實中的山地,就需要研究它怎麼樣構成,然後採用各種方法建立出來。在遊戲的世界裡,對於地形的要求是不嚴謹的,只要看起來像山地,就行了,而不像其它地理系統,一定要精確到跟現實世界里山比例一樣。因此,在這裡建立的 ...

3D遊戲從入門到精通 21 22

2.10.1 燈光與材質 在現實的世界裡,沒有光線,是什麼東西也看不見的。在d3d的世界裡,也是一樣的。但是在d3d裡有一種光線,是非常奇怪的,這種光線是沒有方向,沒有位置,整個世界全可以照亮的光線,它就是環境光,它其實有點像我們現實生活裡的無影燈。在d3d裡光線分為三種型別,分別是點光源 聚光燈和...

3D遊戲從入門到精通 16

4 三角形帶列表 三角形顯示的方式總共分為三種,前面已經學習最多的是三角形列表,現在再來看看三角形帶列表是什麼樣的,這樣有什麼優點呢?這裡顯示圖形如下 上面的圖形可以看出,只有6個頂點就可以顯示4個三角形,而採用三角形列表的方式,只能顯示兩個三角形。因此採用這種方式就會大大提高渲染效率,減少占用記憶...