DirectX 游戏编程之3D空间,顶点缓存及索引缓存

3D物体的模型表示

场景(scene)是物体或模型的的集合,所有物体都可以使用三角形网格逼近表示:

三角形(triangle)是构建物体模型的基本单元,也是基本图元之一(Primitive,包括点和线段)

而构成三角形的则是顶点(vertex),顶点在3D系统中描述一个点,三角形由三个点构成

基本图元(Primitives)

3D空间图形的基本组成元素就是图元(Primitive),不仅仅是三角形,包括以下:

(以下图形在z=0平面)

1点列表(Point Lists):由系列顶点组成,每个点都是独立的,散列的

2线列表(Line Lists):每一组顶点构成一条独立分隔的线段,通常用做3D网格,雨点,路标线等物体建模

3线条纹(Line Strips):类似于线列表,但是每两条线又被一条线段连接,常用于wire-frame物体,如地形,草丛

4三角形列表(Triangle Lists):每三个顶点一组构成一个独立的三角形

5三角形条纹(Triangle Strips):三角形间相互连接

6三角形扇面(Triangle Fans):所有三角形拥有一个共同顶点

顶点缓存与索引缓存

D3D使用灵活顶点格式(Flexible Vertex Format,FVF),定义一个顶点的位置及其他信息,包括颜色、法线等,通过组合不同顶点格式,以令我们可以自定义自己的顶点格式

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)struct CUSTOMVERTEX{FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flagDWORD color; // from the D3DFVF_DIFFUSE flag}

几个重要的顶点格式:

D3DFVF_XYZ

指定x,y,z坐标位置,同时它是Untransformed的,表明未经过顶点转换到屏幕坐标

D3DFVF_XYZRHW

指定xyz坐标,不能与D3DFVF_XYZ共用,其是transformed,表明可以直接使用屏幕坐标而不需要经过世界,取景,投影转换等显示在屏幕上。

D3DFVF_DIFFUSE

顶点包含32bit的漫反射颜色

D3DFVF_SPECULAR

包含32bit镜面反射颜色

D3DFVF_NORMAL

包含法线向量(x,y,z)

D3DFVF_TEX0

-D3DFVF_TEX8

包含纹理坐标(u,v)

一 顶点缓存的创建使用顶点缓存与索引缓存

HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9 **ppVertexBuffer, HANDLE *pSharedHandle);

Length:为缓存分配的字节数,为顶点个数num*sizeof(Vertex)

Usage:缓存的附加属性设置,可以为以下值

D3DUSAGE_DYNAMIC 将缓存设定为动态。

D3DUSAGE_WRITEONLY 缓存设定为只写

FVF:设置灵活顶点格式

Pool:内存池

ppVertexBuffer:顶点缓存的指针

pSharedHandle:保留,设为0

// 三角形的顶点缓存创建IDirect3DDevice9* Device = 0;IDirect3DVertexBuffer9* Triangle = 0; // vertex buffer to store// our triangle data.Device->CreateVertexBuffer(3 * sizeof(Vertex), // size in bytesD3DUSAGE_WRITEONLY, // flags,write onlyD3DFVF_XYZ,// vertex formatD3DPOOL_MANAGED, // managed memory pool&Triangle,// return create vertex buffer0);// not used – set to 0

索引缓存的创建:

HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9 **ppIndexBuffer, HANDLE *pSharedHandle);

二 访问缓存内容

为了访问顶点缓存数据,先获取缓存的内存指针

HRESULT IDirect3DVertexBuffer9::Lock( UINT OffsetToLock, UINT SizeToLock, VOID **ppbData, DWORD Flags);

OffsetToLock:缓存开始到锁定位置的偏移,单位为字节bytes

SizeToLock:锁定字节数。OffsetToLock,SizeToLock都为0,表示锁定全部缓存。

ppbData:指向锁定开始位置的指针

Flags:锁定方式

// 顶点数据格式struct Vertex{Vertex(){}Vertex(float x, float y, float z){_x = x; _y = y; _z = z;}float _x, _y, _z;};Vertex* vertices;Triangle->Lock(0, 0, (void**)&vertices, 0); // 锁定全部缓存// 设置顶点数据vertices[0] = Vertex(-1.0f, 0.0f, 2.0f);vertices[1] = Vertex( 0.0f, 1.0f, 2.0f);vertices[2] = Vertex( 1.0f, 0.0f, 2.0f);// Lock 与 Unlock 成对使用Triangle->Unlock();

获取顶点缓存或索引缓存信息的方法

HRESULT IDirect3DVertexBuffer9::GetDesc( D3DVERTEXBUFFER_DESC *pDesc);和HRESULT IDirect3DIndexBuffer9::GetDesc( D3DINDEXBUFFER_DESC *pDesc);

四 设置绘制状态(rendering state)

HRESULT IDirect3DDevice9::SetRenderState( D3DRENDERSTATETYPE State, DWORD Value);

我们设置绘制物体为线框模式,原默认值为:D3DFILL_SOLID

SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

五 绘制设置

当你能爱的时候就不要放弃爱

DirectX 游戏编程之3D空间,顶点缓存及索引缓存

相关文章:

你感兴趣的文章:

标签云: