3D遊戲從入門到精通 6

2021-08-22 04:23:31 字數 1743 閱讀 4713

1、

頂點緩衝區

頂點的資料是怎麼樣儲存在記憶體裡的呢?由於渲染需要,就要把頂點儲存在記憶體緩衝區裡。最簡單的方法就是使用d3d提供的頂點緩衝區,即是使用idirect3dvertexbuffer9介面的頂點緩衝區管理,它是通過d3d的裝置來建立。這個介面實現頂點的資源管理,使用起來非常方便,由於它管理記憶體分配,這樣就省了記憶體管理。下面就是通過idirect3ddevice9::createvertexbuffer函式來建立乙個頂點緩衝區:

hresult hr;

// 建立頂點緩衝區。

if( failed( hr = m_pd3ddevice->createvertexbuffer( 3*2*sizeof(vt_cai********),

0, vt_cai********::dwfvf,

d3dpool_managed, &m_pvb, null ) ) )

上面這段**,就是建立6個頂點的緩衝區。指定的格式為vt_cai********::dwfvf,這個在前面已經定義過,只包括頂點向量資料。d3dpool_managed指明了建立的緩衝區在系統記憶體裡,並且需要時就拷貝到顯示卡記憶體裡。我們知道顯示卡記憶體越來越大了,如果把很多變化不大的物體放到顯示卡記憶體裡,就可以加速顯示,減少占用系統區域性匯流排的頻寬。像nv新出來的顯示卡,都有1g顯示記憶體,顯然可以放更多物體在那裡,以便顯示的速度更快。

由於顯示卡記憶體和系統記憶體的複雜性,而通過這個介面可以方便地使用了。由於它是還乙個記憶體池,所以產生記憶體碎片的機會就更加少了。

建立頂點緩衝區之後,就需要往裡面填充頂點資料,先來看看下面的**:

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

vt_cai********* pvertices;

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

// 前面三角形。

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

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

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

// 後面三角形。

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

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

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

//解鎖頂點緩衝區。

m_pvb->unlock();

這段**是通過idirect3dvertexbuffer9::lock方法來獲取到頂點緩衝區的指標,然後把6個頂點賦值。最後呼叫idirect3dvertexbuffer9::unlock方法解鎖,如果不解鎖,d3d顯示不了這個緩衝區裡的資料,就會出錯的,所以一定要小心地操作。

電子書mm3d引擎源程式例子源程式49元一套

聯絡人:蔡軍生

****:

email: caimouse1976 at sina.com

3D遊戲從入門到精通 31

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

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

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

3D遊戲從入門到精通 11

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