Direct3D基本图元和顶点缓冲_第1页
Direct3D基本图元和顶点缓冲_第2页
Direct3D基本图元和顶点缓冲_第3页
Direct3D基本图元和顶点缓冲_第4页
Direct3D基本图元和顶点缓冲_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DirectX技术

基本图元和顶点缓冲图元三维图元是组成单个三维实体的顶点集合。在D3D中,一共有三种基本图元,分别是点、线和三角形。通常三维图元是多边形。一个多边形是由至少三个顶点描绘的三维形体。最简单的多边形是三角形。Direct3D使用三角形组成大多数多边形,因为三角形的三个顶点一定是共面的。应用程序可以用三角形组合成大而复杂的多边形及网格(mesh)。绘制基本图元所有的3D图形都是由三角形构成的。为什么是三角形而不是别的图形呢?因为三角形有许多优越之处,例如:绘制效率。而且我们知道,任意不在同一条直线上的三个点都能构成三角形,这对于在空间中形成某种复杂图形是很有益处的。所以,如果我们想得到一个矩形,最有效率的是绘制两个相同的合并的三角形,这样要优于直接绘制一个矩形。

顶点顶点(vertex)就是3D空间中的一个点。例如,三角形有三个顶点,而矩形有四个。在3D空间中,可以用三个顶点来指定一个三角形。要理解顶点,我们首先要理解笛卡尔坐标系。

2D迪卡尔坐标系统

3D迪卡尔坐标系统

3DPrimitives

Primitive为“原始”之意,3Dprimitive就是设备所支持的原始的类型。通常我们也把它们称作“图元”。Primitive包括:点列、线列、线带、三角形列、三角形带和三角扇形。

下面是各种图元的示例PointListsLineLists

LineStrips

TriangleLists

TriangleStrips

TriangleFans

几个基本概念FlexibleVertexFormat(FVF)(灵活顶点格式)

VertexBuffers(顶点缓冲)

Colours(颜色)

FlexibleVertexFormat(FVF)

(灵活顶点格式)灵活顶点格式(FVF)是用来描述顶点属性的一种格式,而这种格式是可以由我们自定义的,所以称它为“灵活顶点格式”。至此,我们至少知道了顶点有三种属性:x值、y值和z值。其实顶点还可以有其他属性,例如颜色。利用灵活顶点格式(FVF)我们能方便的指定顶点的属性。/*如果我们在Direct3D指定了一个多边形,这个多边形将可以被它的各个顶点的属性所填充,而且是带有过渡性的属性填充。*/在D3D里,灵活顶点格式是用一些标志的组合来表示的,如:D3DFVF_XYZRHWD3DFVF_XYZD3DFVF_NORMALD3DFVF_TEX0D3DFVF_DIFFUSE标志组合 #defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

VertexBuffers(顶点缓冲)

顶点缓冲就是一块用于保存顶点的内存缓冲区。顶点缓冲可以保存任何的顶点类型。当一些顶点已经被保存在顶点缓冲区中,就可以通过程序操作它们,例如渲染、变换等。Colours(颜色

)在DirectX中,如果我们要指定一种颜色,我们可以用D3DCOLOR_XRGB宏。宏中有三个参数,每个参数都是0到255间的整数值,分别用于描述颜色的红、绿、蓝分量例如: D3DCOLOR_XRGB(0,0,0)是黑色。 D3DCOLOR_XRGB(255,255,255)是纯白色。 D3DCOLOR_XRGB(0,255,0)是亮绿色(没有红与蓝,全是绿色的分量)。 D3DCOLOR_XRGB(100,20,100)是暗紫色(100红,20绿,100蓝)。渲染顶点Direct3D写的应用程序使用顶点(Vertex)构造几何物体。每一个三维空间(3D)场景包括一个或几个这样的几何物体。用顶点构造一个几何物体应该采用以下步骤:定义一个自定义顶点类型创建顶点缓冲渲染到显示屏

重新定义程序框架创建Direct3D对象创建Direct3D设备渲染清除对象、释放设备Windows框架程序Init3D进入消息循环之前,调用Init3D。若失败,则退出程序在消息循环中渲染场景在消息循化结束时作善后工作定义一个自定义顶点类型First创建顶点缓冲然后定义一个自定义顶点类型

structCUSTOMVERTEX{FLOATx,y,z,rhw;//Thetransformed //positionforthevertex.DWORDcolour;//Thevertexcolour.};

上面的结构说明了自定义顶点类型的格式。下一步是定义FVF以描述顶点缓冲区中的顶点内容。以下代码片段定义了一个FVF并符合此上建立的自定义顶点类型。

#defineD3DFVF_CUSTOMVERTEX\ (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

可变顶点格式标记描述了使用中的自定义顶点类型。前述示例代码使用了D3DFVF_XYZRHW和D3DFVF_DIFFUSE标志,这将告诉顶点缓冲,自定义顶点类型包含一组转换过的点坐标并紧跟着一个颜色参数。其中,x、y使用窗口坐标,z、rhw代表深度.只要把z,rhw设置成常数(通常z取0,rhw取1),就可以用它来定义二维图形。colour描述了对应顶点的颜色现在,我们的程序头部应该有这些声明LPDIRECT3D9 g_pD3D=NULL;LPDIRECT3DDEVICE9 g_pD3DDevice=NULL;LPDIRECT3DVERTEXBUFFER9g_pVertexBuffer=NULL;//BuffertoholdverticesstructCUSTOMVERTEX{FLOATx,y,z,rhw;//Thetransformed //positionforthevertex. DWORDcolour;//Thevertexcolour.};#defineD3DFVF_CUSTOMVERTEX\(D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

创建顶点缓冲及其步骤创建顶点数组在显存里创建顶点缓冲将顶点数据拷贝到顶点缓冲里在没有引入变换矩阵之前,我们的坐标系是这样的 屏幕坐标系(0,0)创建顶点数组顶点坐标系CUSTOMVERTEXcvVertices[]= { {-100.0+250,50.0+250,1.0,1.0, D3DCOLOR_XRGB(255,0,0)}, {-50.0+250,-50.0+250,1.0,1.0, D3DCOLOR_XRGB(0,255,0)}, {0.0+250,50.0+250,1.0,1.0, D3DCOLOR_XRGB(0,0,255)}, {50.0+250,-50.0+250,1.0,1.0, D3DCOLOR_XRGB(255,0,255)}, {100.0+250,50.0+250,1.0,1.0, D3DCOLOR_XRGB(255,255,0)}, {150.0+250,-50.0+250,1.0,1.0, D3DCOLOR_XRGB(0,255,255)} };

这段代码片段采用六个顶点填充六个Vertex,并指定了每个顶点的散射光的颜色。每一点都具有相同的Z值1.0及1.0的RHW参数创建顶点缓冲区

创建顶点缓冲区,用到CreateVertexBuffer,该函数的原型是:HRESULTIDirect3DDevice9::CreateVertexBuffer( UINTLength, DWORDUsage, DWORDFVF, D3DPOOLPool IDirect3DVertexBuffer9**ppVertexBuffer, HANDLE*pSharedHandle);Length:新顶点缓冲区预计的大小Usage:

指定关于怎样使用缓存的额外信息。这个值可以是0,或者是下面标记的一个或多个的组合:D3DUSAGE_DYNAMIC——设置这个参数可以使缓存是动态的。D3DUSAGE_POINTS——这个参数指定缓存存储原始点。D3DUSAGE_SOFTWAREPROCESSING——使用软件顶点处理D3DUSAGE_WRITEONLY——指定应用程序只能写缓存。它允许驱动程序分配最适合的内存地址作为写缓存。注意如果从创建好的这种缓存中读数据,将会返回错误信息。FVF:灵活顶点格式,这里的顶点格式是 D3DFVF_CUSTOMVERTEX,就是在程序最先 定义的FVF值Pool:顶点缓冲区的存储位置,一般情况下使用

D3DPOOL_DEFAULT标记告 Direct3D在最合适的位置创建此顶点

缓冲区。**ppVertexBuffer:返回创建完成的顶点缓的地址pSharedHandle:没有使用,设置为0。综上,我们创建顶点缓冲区的代码如下:if(FAILED(g_pD3DDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL))){ returnE_FAIL;}拷贝数据创建了顶点缓冲区之后,开始采用自定义格式的顶点填充缓冲区中的数据。要完成这步操作,我们需要锁定顶点缓冲区把数据写入顶点缓冲区解锁锁定顶点缓冲区锁定缓冲区,需要用到函数:Lock

其原型是:

HRESULTIDirect3DVertexBuffer9::Lock( UINTOffsetToLock, UINTSizeToLock, VOID**ppbData, DWORDFlags );OffsetToLock:是锁定顶点数据的偏移量,按

字节计算SizeToLock:需锁定的顶点数据长度,同样按字

节计算**ppbData:一个VOID类型指针的地址,

用于返回指向顶点数据的地址Flags:告知顶点缓冲区如何锁定数据

一般赋值为0锁定的代码片段if(FAILED(g_pVertexBuffer->Lock( 0, sizeof(cvVertices), &pVertices, 0) ) ){ returnE_FAIL;}把数据写入顶点缓冲区通过锁定,我们已经是指针pVertices指向了顶点缓冲区,所以下面只要用Windows的API函数memcpy就可以向顶点缓冲区里拷贝数据了memcpy函数的原型: void*memcpy(void *dest,//目的地址

constvoid*src,//源地址

size_t count//要拷贝的数据字节数

);所以,拷贝的代码:

memcpy(pVertices,cvVertices,sizeof(cvVertices));解除锁定通过使用memcpy,顶点被复制到顶点缓冲区里。将顶点放入缓冲区之后,因该调用一次IDirect3DVertexBuffer9::Unlock以解锁顶点缓冲区函数原型:

HRESULTUnlock();解锁的代码:

g_pVertexBuffer->Unlock();

渲染现在缓冲区已经填入顶点,就可以把它渲染到显示屏上。渲染的一般步骤:清除颜色缓存、模板缓存、深度缓存调用BeginSecen()函数打开3D渲染开关设置流数据源设置顶点格式渲染图元调用EndScene()函数关闭3D渲染开关清除缓存,把屏幕背景清除为白色

g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255),1.0f,0);调用BeginSecen()函数打开3D渲染开关

if(SUCCEEDED(g_pD3DDevice->BeginScene()) { … }

这个函数在使用过程中,要注意检查它的返回值在BeginScene函数没有调用成功时,不可以调用EndScene();在BeginScene()调用成功后,如果渲染过程中,有任何错误发生,需要调用EndScene()关闭渲染开关在调用EndSecne()时不必检查函数的返回值。设置流数据源

设置流数据源目的是告诉Direct3D要渲染的顶点在何处,设置流数据源需要用到IDirect3DDevice9::SetStreamSource函数。函数原型:

HRESULTSetStreamSource(

UINT StreamNumber, IDirect3DVertexBuffer9 *pStreamData,

UINT OffsetInBytes, UINT Stride

);StreamNumber:设备设置数据流的索引。有些显卡支持多个数据流同时渲染。这里这个索引等于顶点流数目-1。当只有一个数据流,这个值应该等于0*pStreamData:指向该数据流上的顶点缓冲区的指针OffsetInBytes:相对流开始处的偏移量。以字节为单位,它指定被填入渲染管线的顶点数据的开始位置。通过检查D3DCAPS9结构中的D3DDEVCAPS2_STREAMOFFSET标志,假如你的设备支持,那么这个参数就有一些非0值。Stride:我们在顶点缓存中操作的每个部分的流的字节大 小。代码:

g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));设置顶点格式接下来应该通过调用IDirect3DDevice9::SetFVF函数使Direct3D了解使用中的顶点类型。函数原型:

HRESULTSetFVF(DWORDFVF); SetFVF()唯一的参数是当前设置的顶点处理器的句柄。这个参数的值是程序自定义的灵活顶点格式。即定义的宏D3DFVF_CUSTOMVERTEX。

以下代码片段设置顶点格式:

g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);渲染图元接下来使用IDirect3DDevice9::DrawPrimitive绘制顶点缓冲区中的顶点函数原型:

HRESULTDrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount );PrimitiveType:通知Direct3D绘制哪种类型的图元这是一个枚举类型

typedefenum_D3DPRIMITIVETYPE { D3DPT_POINTLIST =1, D3DPT_LINELIST =2, D3DPT_LINESTRIP =3, D3DPT_TRIANGLELIST =4, D3DPT_TRIANGLESTRIP =5, D3DPT_TRIANGLEFAN =6, D3DPT_FORCE_DWORD =

0x7fffffff }D3DPRIMITIVETYPE;StartVertex:第一个顶点的索引PrimitiveCount:绘制的图元的数目绘制图元的代码片段

switch(iStyle) { case0: g_pD3DDevice->DrawPrimitive( D3DPT_POINTLIST,0,6); break; case1: g_pD3DDevice->DrawPrimitive( D3DPT_LINELIST,0,3); break; case2: g_pD3DDevice->DrawPrimitive( D3DPT_LINESTRIP,0,5); break;

case3: g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST,0,2); break;

case4: g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,0,4); break; case5: g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLEFAN,0,4); break; default: g_pD3DDevice->DrawPrimitive( D3DPT_POINTLIST,0,6); break; }最后,调用EndScene()函数关闭3D渲染开关,并把渲染结果拷贝到屏幕上代码片段:

g_pD3DDevice->EndScene(); g_pD3DDevice->Present( NULL,NULL,NULL,NULL);创建顶点缓冲代码HRESULTInitVertexBuffer(){ VOID*pVertices; //Storeeachpointofthetriangletogetherwith//it'scolour //创建顶点数组

CUSTOMVERTEXcvVertices[]= { {-100.0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论