欢迎来到天天文库
浏览记录
ID:52347182
大小:204.29 KB
页数:7页
时间:2020-03-26
《【 Visual C++】游戏开发笔记之三——绘制图元.pdf》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、【C++游戏编程】游戏开发梦想的集散地—毛星云(浅墨)的专栏愿尽以绵薄之力,薪火相传游戏开发的信仰与梦想,复兴国产单机游戏。【VisualC++】游戏开发笔记之三——绘制图元分类:【DirectX】【VisualC++】游戏开发2012-03-0501:1612192人阅读评论(20)收藏举报游戏c++direct3dnullstructure图形使用Direct3D绘制图元我们接下来的部分将介绍使用Direct3D在屏幕上绘图的图元。计算机图形学中的图元是可以渲染到屏幕上的基本形状。将图元组合在一起可以构成不同的形状和物体,诸如人物模型、场景物体、墙、建筑物等。最常用的图元是三
2、角形。在游戏中常使用三角形,这是因为这样可以优化现代图形硬件,有效处理这类图元。其他图元包括四方形、直线和多边形。多边形被认为是图形,它是由直线构成的封闭区域。Direct3D中在屏幕上绘制图元的方法主要有两种。第一种是使用指针将几何图形数据数组发送给某个Direct3D函数。通常很少使用这种方法,因为这种方法运行缓慢,而且效率很低。这种方法之所以运行缓慢,是因为在Direct3D内部要对数据做一些不必要的工作,这样才能将数据下传给流水线,流水线负责绘制每个对象的每一帧。第二种方法是在绘制几何图形时使用一种名为顶点缓存的结构。顶点缓存是一个Direct3D对象,它可以按照Dire
3、ct3D格式存储几何图形数据。借助用户指针(第一种方法),每次在程序中调用渲染函数时,Direct3D都不得不创建一个临时顶点缓存。这很浪费时间,尤其是如果信息没有发生变化,而且从技术角度而言,只需要创建顶点缓存一次时。为了使用用户指针在屏幕上绘制图元或图元组,就要调用Direct3D设备对象中的DrawPrimitive()函数。该函数原型如下所示:HRESULTDrawPrimitiveUP(D3DPRIMITIVETYPEPrimitiveType,UINTPrimitiveCount,CONSTvoid*pVertexStreamZeroData,UINTVertexSt
4、reamZeroStride);DrawPrimitiveup()函数的参数包括要绘制的图元类型、图元数量、保存要绘制的数据数组、顶点流大小。第一个参数是图元类型,如果要绘制的图元是一些点,那么该参数值可以设为D3DPT_POINTLIST;如果要绘制的图元是一些线段,那么该参数值可以设为D3DPT_LINELIST(例如:点1和点2连接,点3和点4连接);如果要绘制的图元是连接的线段,那么该参数值可以设为D3DPT_LINESTRIP(例如:点1和点2相连,点2和点3相连);如果要绘制的图元是一些离散的三角形,那么该参数值可以设为D3DPT_TRIANGLELIST(例如:点1
5、、点2和点3构成一个三角形,而点4、点5和点6构成另一个三角形);如果要绘制的图元是一些相连的三角形,那么该参数值可以设为D3DPT_TRIANGLESTRIP(例如:点1、点2和点3构成一个三角形,点2、点3和点4构成另一个三角形);也可以设为D3DPT_TRIANGLEFAN(例如:点1、点2和点3构成一个三角形,而点1、点3和点4构成另一个三角形)。当处理三角形时,所选的三角形类型取决于将数据发送给渲染API的方式。如果发送给Direct3DAPI一列三角形,而三角形中的每个点互不相同,那么D3DPT_TRIANGLELIST就是最佳选择。其余参数非常简单明了。DrawPr
6、imitiveUP()函数的第二个参数是发送给函数的图元总数。如果将要绘制10个三角形,那么应该设该参数为10,除非只想绘制某一部分图元。第三个参数是发送给该函数的图元数据数组。第四个参数和最后一个参数是每个顶点的大小(单位:字节)。如果每个顶点都只指定了x、y、z浮点坐标位置数据,那么该参数值应该是12个字节。这因为它包含三个值,每个值分别是4个字节。Direct3D顶点缓存第二种方法(也即我们使用的方法)是使用Direct3D顶点缓存来存储和渲染几何图形数据。顶点缓存是LPDIRECT3DVERTEXBUFFER9类型的结构。该结构是LDirect3DVertexBuffer
7、9的指针。在创建顶点指针时,要将其和正确渲染对象所需的全部信息一起加载。顶点缓存并不包含顶点数据。它同样可以保存顶点颜色、方向以及显示对象所需的其他属性。调用Direct3D对象设备的CreateVertexBuffer()函数可以创建顶点缓存。只有成功创建Direct3D设备对象后,才可以调用该函数。下面我们贴出CreateVertexBuffer()的函数原型。HRESULTCreateVertexBuffer(UINTLength,DWORDUsage,DWORDFVF,D
此文档下载收益归作者所有