3D游戏从入门到精通-6

时间:2021-07-10 20:02:30
1、             顶点缓冲区
顶点的数据是怎么样保存在内存里的呢?由于渲染需要,就要把顶点保存在内存缓冲区里。最简单的方法就是使用D3D提供的顶点缓冲区,即是使用IDirect3DVertexBuffer9接口的顶点缓冲区管理,它是通过D3D的设备来创建。这个接口实现顶点的资源管理,使用起来非常方便,由于它管理内存分配,这样就省了内存管理。下面就是通过IDirect3DDevice9::CreateVertexBuffer函数来创建一个顶点缓冲区:
 
HRESULT hr;
 
// 创建顶点缓冲区。
 if( FAILED( hr = m_pd3dDevice->CreateVertexBuffer( 3*2*sizeof(VT_CAITRIANGLE),
       0, VT_CAITRIANGLE::dwFVF,
       D3DPOOL_MANAGED, &m_pVB, NULL ) ) )
 {
       //创建顶点缓冲区失败。
       return DXTRACE_ERR( "CreateVertexBuffer", hr );
 }
上面这段代码,就是创建6个顶点的缓冲区。指定的格式为VT_CAITRIANGLE::dwFVF,这个在前面已经定义过,只包括顶点向量数据。D3DPOOL_MANAGED指明了创建的缓冲区在系统内存里,并且需要时就拷贝到显示卡内存里。我们知道显示卡内存越来越大了,如果把很多变化不大的物体放到显示卡内存里,就可以加速显示,减少占用系统局部总线的带宽。像NV新出来的显示卡,都有1G显示内存,显然可以放更多物体在那里,以便显示的速度更快。
由于显示卡内存和系统内存的复杂性,而通过这个接口可以方便地使用了。由于它是还一个内存池,所以产生内存碎片的机会就更加少了。
创建顶点缓冲区之后,就需要往里面填充顶点数据,先来看看下面的代码:
 
// 用两个三角形填充顶点缓冲区。
 VT_CAITRIANGLE* pVertices;
 
 if( FAILED( hr = m_pVB->Lock( 0, 0, (VOID**)&pVertices, 0 ) ) )
 {
       //锁住顶点缓冲区。
       return DXTRACE_ERR( "Lock", hr );
 }
 
 // 前面三角形。
 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 元一套
联系人:蔡军生  
联系方式:
QQ: 9073204
EMAIL: caimouse1976 at sina.com