OPENGL技术3D游戏的开发研究项目报告.docx
- 文档编号:14380820
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:38
- 大小:2.87MB
OPENGL技术3D游戏的开发研究项目报告.docx
《OPENGL技术3D游戏的开发研究项目报告.docx》由会员分享,可在线阅读,更多相关《OPENGL技术3D游戏的开发研究项目报告.docx(38页珍藏版)》请在冰点文库上搜索。
OPENGL技术3D游戏的开发研究项目报告
OPENGL技术3D游戏的开发研究项目报告
国内外现状的研究
3D游戏开发方面:
从技术上来看,国外的3D游戏开发技术已经趋于成熟,3D游戏引擎也日渐完善,大多数高质量的3D游戏均产于国外。
无论从画面的真实细腻程度上讲,还是从整个游戏操作的流畅程度来讲,亦或者从游戏的故事情节上来看,国外的3D游戏均已达到一个很高的境界。
反观国内,3D游戏近年来在刚刚起步,技术不够成熟,也没有很好的游戏引擎,要达到国外的水平,3D游戏的开发在国内还是有很多要解决的问题。
从经济上来看,国外的3D游戏制作公司规模大,不仅有商品的收入,而且版权上也有法律的保障。
在国内,由于盗版软件的泛滥,版权问题很难得到保障,游戏开发商制作出来的游戏很难保证不被破解,开发商损失严重,经济利益难以保证。
从社会的支持上来看,对于3D游戏的发展,由于文化区域的不同,社会上对这不是采取一种打压的态度,这使得游戏的开发有一个很安稳的环境。
而国内,因为文化原因,大多数的家长害怕自己的孩子沉迷于游戏,而荒废正业,这使得3D游戏的开发处在一个艰难的阶段,因为有绝大多数的家长还是希望自己的孩子能远离这些东西。
无论从技术上、还是经济上,还是社会的态度上,相比于国外,3D游戏的制作开发都有非常长的一段路要走。
OpenGL方面:
在国外OpenG是具有一定的生命力的,唯一能够取代微软对3D图形技术的完全控制的API。
但是由于SiliconGraphics公司已经不再以任何让微软不悦的方式推广OpenGL,所以采用OpenGL开发游戏还是具有一定风险。
鉴于OpenGL的特点,还是有许多非常重要的开发人员仍然在使用OpenGL进行游戏的开发与创作。
因此,硬件开发商目前正在想法设法地加强硬件对OpenGL的技术支持。
现阶段,OpenGL在图形设备以及相关专业占据着统治地位,这是因为Direct3D目前还不能支持这些领域的应用。
目前,国内的3D游戏开发技术正处于赶超国外的发展时期,从游戏的创意、游戏的策划、游戏的研究开发与游戏的实现,再到到游戏的运营与维护,都需要大量的知识值得学习。
现阶段,由于Linux操作系统免费开放源码,以及在程序开发方面有很大的优势,所以在开发领域Linux平台被大力推广,基于Linux的各种应用软件也层出不穷,因此跨平台3D游戏开发也越来越受重视。
由于OpenGL是一种与平台无关的三维图形开发库,在各种语言结合应用OpenGL函数进行主框架开发并都可以开发出3D游戏。
但是由于框架开发的平台相关性使得开发出来的游戏无法跨平台编译运行,因此glut+OpenGL的方式成了一种很好的选择。
开发技术与开发平台
1.4.1开发技术
3D游戏设计是以计算机三维图形学作为游戏的技术基础。
在游戏的设计制作阶段,3D游戏世界里所有物体都是以模型的方式建立的,游戏中的立体感和光影效果都是通过对不同的光源和光照的特点进行实时3D渲染而成。
3D游戏把游戏世界中的每个物体都看作是一个立体的对象,三维图形可以包含对象360度的信息,能从各个角度去观察游戏场景。
3D游戏设计主要的功能模块有:
3D引擎模块:
除了对游戏提供异常处理、日志系统、资源管理等功能,主要是对游戏提供3D图形的效果渲染以及3D图形的显示。
系统支持模块:
主要提供了包括定时器管理、窗口管理等功能在内,操作系统功能使用的封装以及引擎在当前操作系统下驱动的功能。
场景管理模块:
主要提供了对3D游戏引擎中的场景的管理与维护功能,采用多叉树的方法对总场景进行管理与分割的功能。
人机交互模块:
主要提供了对输入设备的管理,获取记录输入设备产生的响应,例如键盘管理、手柄管理、鼠标管理等功能。
数学库:
主要提供了对3D游戏游戏引擎所需要的数学库的支持,包括三角函数计算、四元数、矩阵、向量等;
音频处理模块:
主要提供了对音频文件相关支持,如音频效果的处理、音频文件的播放等。
1.4.2开发平台
关于3D游戏开发,一般是使用C++与OpenGL结合或是采用C++与DirectX结合的方式进行设计开发,这对程序员有很高的要求。
当开发大型3D游戏时,这种方式的工作量与困难程度会达到一个令人难以想象的地步。
如今最有效的开发还是利用游戏引擎进行游戏的开发。
本文主要是研究3D射击游戏的制作,设计开发一个很简单的3D射击类游戏。
利用VC++6.0与OpenGL结合,进行游戏制作,模型则是采用的MD2模型。
OpenGL(全写OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
VisualC++6.0,是微软推出的一款C++编译器,简称VC或者VC6.0,是一款将“高级语言(编程序言)”翻译为“低级语言(机器语言)”的程序。
VisualC++是一个功能强大的可视化软件开发工具。
自微软公司推出VisualC++后,随着其版本的更新换代,VisualC++已经成为专业程序员开发软件的首选工具。
2OpenGL简介与3D图形学相关
2.1OpenGL简介
OpenGL(全写OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
OpenGL适用于从普通PC到大型图形工作站等各种计算机,并可与各种主流操作系统兼容,从而成为占据主导地位的跨平台专业3D图形应用开发包,进而也成为该领域的行业标准。
2.1.1OpenGl特点
OpenGL作为一个性能卓越的图形应用编程接口(API),适用于广泛的计算机环境,并已成为目前三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。
OpenGL的应用领域十分广泛,如军事、电视广播、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟现实等。
它具有以下特点,如图2-1:
图2-1OpenGL特点
图形质量好、性能高:
无论是三维动画、CAD,还是可视化计算机、视觉模拟等,都利用了OpenGL高性能、高图形质量的特点。
这个特点使得程序员在医学图像、虚拟现实、CAM/CAD/CAE、广播和等领域中创造和显示出超乎想象的图形。
行业标准:
OpenGLARB作为独立的联合委员会,制定了OpenGL的规范文档。
伴随硬件厂商对OpenGL的硬件支持,OpenGL成为了是唯一独立于供应商的、真正开放的跨平台图形标准。
稳定性:
在任何平台上都能执行OpenGL,而且它高版本兼容低版本,用来保证已经开发完成的应用程序不会失效。
可靠性和可移植性:
利用OpenGL技术开发的应用图形软件与硬件无关,只要硬件支持OpenGLAPI标准就可以了,也就是说,OpenGL应用可以运行在支持OpenGLAPI标准的任何硬件上。
可扩展性:
OpenGL是低级的图形APi,它具有充分的可扩展性。
只要厂商提供OpenGL扩展,就可以轻松实现硬件特有功能。
利用OpenGL扩展,OpenGL实现者可以添加新的处理算法。
可适应性:
基于OpenGLAPI的图形应用程序可以运行在许多系统上,有次,OpenGL应用程序可以适应开发人员选择的各种目标平台。
易用性:
OpenGL具有良好的结构、直观的设计和逻辑命令。
与其它的图形程序包相比,OpenGL应用程序只有很少的代码,因此执行速度快。
此外,OpenGL封装了有关基本硬件信息,使开发人员无须针对具体的硬件进行专门的设计。
2.1.2OpenGL功能
OpenGL是一个独立于操作系用和窗口系统开放的三维图形软件包,以OpenGL为基础开发的应用程序可以十分方便地在各种平台间进行移植;OpenGL还可以与VC++紧密接口,便于实现图形的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。
它具有以下功能:
图2-2OpenGL功能
建模:
OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
变换:
OpenGL图形库的变换包括基本变换和投影变换。
基本变换有平移、旋转、缩放、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。
其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
颜色模式设置:
OpenGL颜色模式有两种,即RGBA模式和颜色索引(ColorIndex)。
光照和材质设置:
OpenGL光有自发光(EmittedLight)、环境光(AmbientLight)、漫反射光(DiffuseLight)和高光(SpecularLight)。
材质是用光反射率来表示。
场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
纹理映射(TextureMapping)。
利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、抗锯齿(反走样)(Antialiasing)和雾(fog)的特殊图象效果处理。
以上三条可使被仿真物更具真实感,增强图形显示的效果。
双缓存动画(DoubleBuffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现运动模糊、深度暗示等特殊效果,利用这些效果可以实现消隐算法。
2.1.3OpenGL渲染
实现绝大部分OpenGL操作顺序都十分相似,即就是OpenGL渲染管线的一系列相关的处理阶段。
它的操作顺序如图2-2:
图2-3OpenGL渲染流程
显示列表:
任何数据,不管它所描述的是几何图形还是像素,都可以保存在显示列表中,供当前货以后使用。
求值器:
所有的几何图元最终都要根据定点来描述。
基于顶点的操作:
对于顶点数据,接下里的一个步骤就是“基于顶点的操作”,就是把顶点变换为图元。
图元装配:
图元装配的一个主要部分就是裁剪,它的任务是消除那些位于一个半空间之外的那部分几何图元,而这个班空间是有一个平面所定义的。
点裁剪就是简单地接受或拒绝顶点,直线或多边形裁剪则能够添加额外的顶点,具体取决于直线或多边形是如何进行裁剪的。
像素操作:
首先,来自系统内存的一个数组中的像素进行解包,从多种格式之一的解包为适当数量的成分。
接着,数据被缩放、便宜,并根据像素图进行处理。
处理结果先进行截取,然后或者写入到纹理内存,或者发送到光栅化阶段。
纹理装配:
OpenGL应用程序可以在几何物体上应用纹理图形,使它们看上去更为逼真。
光栅化:
光栅化就是把几何数据和像素数据转换为片段的过程。
片段操作:
在数据使劲存储到帧缓冲区前,将要执行一系列操作。
这些操作可能会修改甚至丢弃这些片段。
所有这些操作都可以被启用或者禁用。
2.23D图形学相关
2.2.1向量与矩阵
向量,在数学中的定义是,既有大小又有方向的量。
三维的向量
,分别表示的是沿X坐标方向、Y坐标方向和Z坐标方向的位移。
3D程序是使用4D向量
,这样主要方便进行移动变换,第四维通常只取“1”。
矩阵,在数学中的定义是,纵横排列的二维数值列阵。
3D程序是使用的4×4的矩阵对向量,这样主要方便进行移动变换。
2.2.2变换
变换可以分为平移变换、旋转变换、缩放变换。
平移变换:
可以被认为是把一个点从3D空间中的一个坐标位置移动到另一个坐标位置。
要对一个点进行平移变换,只需要将每个坐标轴的增量值,或者说沿每个坐标轴的平移数值,加上要平移坐标点的原始坐标值就行了。
旋转变换:
在x轴旋转时,其x轴坐标表示不变。
关于y轴的旋转与z轴的旋转也是同样的道理。
要让一个点绕某一坐标轴旋转,就用此坐标轴旋转矩阵乘以这个点。
旋转变换所形成的连续组合变换的思路是合并矩阵,将几个变换矩阵合并成一个变换矩阵,先绕z轴转,再绕y轴转,最后绕x轴旋转。
缩放变换:
通过将顶点与一个缩放因子相乘的方法来缩放顶点。
2.2.3投影
在3D图形学中,要涉及到两种投影,一种是平行投影,另一种则是透视投影。
平行投影,即就是在一束平行光线照射下形成的投影。
平行投影可以分两步来完成,第一步先将投影的平面转换到3D空间中的xy平面上,第二部就是除去所有可见点z项的坐标信息。
透视投影,则是用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。
透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点,如图2-4:
图2-4投影
2.2.43D裁剪
当物体的世界坐标超值超过屏幕视区范围时,对物体进行透视变换操作就可能引起错误。
特别在z值为0时,错误就会发生;当z轴为负数时,物体处在观察者后面,就无需进行变换。
解决这一问题通常是创建一个视体(视体其就是3D空间中相对于观察者为可见的一个区域)。
在视体外的任何物体都不能被观察者看到,因此就不能对其进行变换。
对于透视投影来说,视体为金字塔形,如图2-5:
图2-5透视投影的物体总是金字塔形状
3游戏设计
3.1游戏的组成
一个游戏作品可以分为游戏引擎和游戏资源两大部分。
游戏引擎是一个为运行某一类游戏的机器设计的能够被机器识别的代码(指令)集合。
它像一个发动机,控制着游戏的运行。
游戏资源包括声音、图象、动画等部分,游戏=引擎(程序代码)+资源(声音、动画、图象等)。
游戏引擎则是按游戏设计的要求顺序的调用这些资源。
对于一个游戏的开发来说,游戏资源反映了一个游戏所能带给人们的感官刺激,而游戏引擎的优良程度则是这款游戏可玩性的一个重要指标。
对于一个简单的游戏来说,它的游戏引擎可以分成输入设备、游戏逻辑、场景数据库、音频子系统、场景物体对象、纹理处理、物理子系统、粒子系统。
它们之间的关系如图3-1:
图3-1游戏引擎组成
在实际运行中,引擎通过设备输入子系统接受输入,并向游戏逻辑子系统发送相应的消息,然后游戏逻辑子系统处理相应的消息,并执行相应的一个游戏循环。
在单一游戏循环之中,游戏逻辑子系统对如如做出反应,对游戏物体对象之星所需要的所有物理计算、处理碰撞检测和反应、载入和销毁物体对象、在场竞争移动视点、以及播放游戏运行时所需要的所有声音。
3.2游戏的结构
对于游戏的开发,需要有一个游戏结构的设计,可以开发更多的组件以实现特殊的性能和功能,来保障游戏软件的平稳运行。
游戏与其它应用软件有着一定的区别,它不是我们的单线、事件驱动或顺序逻辑的程序。
一个3D游戏本质上是一个持续不断的while循环,它执行逻辑并在屏幕上不间断的绘制更新图像,如图3-2:
图3-2一个游戏的组成
3.3本游戏设计
在本次设计中所展示的是一个3D射击类游戏,要求玩家在限时内,在场景冲找出所有敌人并将其消灭。
游戏中所包括的性能有粒子爆炸效果、MD2模型的载入、动画和边界碰撞检测、视点的控制和移动、声音效果、简易AI系统、地形的绘制与生成。
在组成上则是采用游戏引擎+游戏资源的设计方法来设计并实现游戏。
游戏框架结构如图3-3、图3-4、图3-5和图3-6:
图3-3游戏工程结构
图3-4sourcefiles内含结构
图3-5headerfiles内含文件结构
图3-6externaldependencies内含文件结构
下面,这里主要说明一下,此游戏中所采用的关键技术。
4关键技术
4.1摄像机漫游
在3D游戏中,用户通常可以通过鼠标或者键盘操作角色在场景中移动,进而完成各种有意思、富有挑战的任务,大道场景漫游的效果。
这是人机交互的一种重要体现,能够大大提高游行可玩性,这就需要用到漫游。
而在三维场景漫游中,观察各可以通过鼠标或键盘来控制视点的位置、视向和参考方向。
当视点的位置、视向和参考方向发生改变时,场景中的物体相对于观察者的方位也发生了变化,从而产生了“动感”。
系统中,视点即就是人的“化身”。
其功能与现实世界的摄像机类似,视线方向可由参考点位置确定(参考点位置减去视点位置即可得到视线方向的向量)。
在游戏中,由摄像机来成为人在游戏中的视点,通过摄像机发生变化,从而引起视角的变化,这样就模拟了游戏角色所观察到的景物的变化。
在游戏中,需要通过键盘上的方向键实现先后左右的移动,通过鼠标的拖拽实现旋转视图以从多角度观察地物。
实际上,在场景漫游时可以通过设置视点以及观察方向来实现,需要用到OpenGL辅助函数库中的gluLookat()函数,通过设置相应参数实现场景漫游。
VoidgluLookat(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,
GLdoublecenterx,GLdoublecenterxy,GLdoublecenterxz,
GLdoubleupx,GLdoubleupy,GLdoubleupz);
该函数的9个参数定义了一个视图矩阵,并使用该矩阵与当前矩阵相乘。
前三个参数(eyex,eyey,eyez)定义了视点位置,即观察者位置;中间三个参数(centerx,centery,centerz)定义了摄像机的参考点,即摄像机的朝向;最后三个参数(upx,upy,upz)定义了摄像机的向上向量,一般定义为(0,1,0)。
在计算机看到图形时,我们的观察点为(0,0,0),也就是为什么我们总要把图形Z坐标设为小于0的原因(Z大于0是图形在屏幕外面)。
在OpenGL中观察虚拟世界的主要函数是gluLookAt(…),它的主要作用是可以改变我们在OpenGL场景中的观察点,看到前面的景物越来越近,两边的物体在向后退,这就是我们的观察点在场景中的位置改变的结果。
gluLooKAt(视点,目标点,视点方向)
其中视点(观察点)是一个三维坐标向量。
X量的变化就像是我们在场景中的横向移动。
Y量的变化就像是我们的身体高度的变化(游戏中角色的站立或卧倒)。
Z量的变化就像是我们在场景中前后移动。
目标点,视点方向也分别是三维向量。
视点的变化,相当于我们人在场景中移动。
目标点的变化,相当于我们人站着不动时,头或者手中的相机上下左右移动的效果。
视点方向Y=1表示我们的头始终是正立的。
图4-1反映了摄像机类相关:
图4-1摄像机类的组成
4.2碰撞检测
我们知道,几乎所有的3D游戏都离不开碰撞检测——无论是各物体之间的碰撞检测,还是物体与场景之间的碰撞检测。
比如说人物在场景中可以平滑移动,遇到一定高度内的台阶可以自动上去,而过高的台阶则把人挡住,遇到斜率较小的斜坡可以上去,斜率过大则把人挡住,人物到场景边缘而不会掉出场景等。
碰撞检测算法主要有三种:
基于包围盒的碰撞检测算法,基于距离计算的碰撞检测算法,基于维诺图的碰撞检测算法。
4.2.1包围盒算法
4.2.1.1轴平行包围盒AABB算法
在一个AABB包围盒的描述中,需要六个坐标量,这是因为在进行碰撞检测时,AABB是每条边都平行于坐标轴3D几何体的外接平行六面体。
在构造轴平行包围盒AABB的时候,需要AABB包围盒在方向上具有一致性,这就使得构造时要沿着物体局部坐标系的轴向来构造包围盒。
轴平行包围盒AABB的算法相对来说比较简单,很容易就能实现,但AABB的紧密性相对来说比较差。
AABB需要跟着几何体的旋转而一起旋转,这样的操作,会使得计算量相对增加,从而使得算法效率下降。
轴平行包围盒AABB的计算重点在于对AABB的中心以及盒子长、宽、高的计算,从而得出包围盒的大小。
AABB内的任意一点V(x,y,z)都需要满足公式4.1:
(4-1)
式4-1AABB内的任一点V(x,y,z)满足条件
公式中Xmax指模型中各个点在x轴方向的最大值、Xmin指模型中各个点在x轴方向的最小值;Ymax指模型中各个点在Y轴方向的最大值,Ymin指模型中各个点在Y轴方向的最小值;Zmax指模型中各个点在z轴方向的最大值,Zmin指模型中各个点在z轴方向的最小值。
要计算包围盒的中心点,需要得到两个重要的点Pmin=[Xmin,Ymin,Zmin],Pmax=[Xmax,Ymax,Zmax],得到两点后可以计算中心点。
中心点m和长、宽、高a,b,c分别为,如式4-2
(4-2)
式42中心点m和长、宽、高a,b,c
4.2.1.2包围球算法
在进行碰撞检测时,包围球是3D几何体的最小外接球。
包围球算法也比较简单,很容易就能实现,但包围球的紧密性相对来说也比较差。
包围球在旋转上不同于AABB,它不需要跟随3D模型的旋转而旋转。
包围球的球心和半径的计算是得到包围球的重点。
其球心的计算方法与AABB的计算方法相同。
包围球的半径是长、宽、高的最大值。
在AABB算法的基础上,包围球的球心及半径的计算满足公式4.3:
(4-3)
式4-3球心m和半径R
4.2.1.3沿任意方向包围盒OBB(OnentedBoundingBox)算法
在AABB、包围球、OBB算法中,OBB是包含这个3D物体并且相对于坐标轴方向任意的平行六面碰撞体,它是最接近3D几何体的平行六面体。
OBB包围盒方向的任意性是它区别与其他两个包围盒的最大特点。
这个特点使得OBB可以根据碰撞对象外形的不同来尽可能得包围对象。
在包围的对象进行旋转操作时,只需要对OBB的基底进行一样的旋转,这使得运算不会变得非常复杂,并且场景的运行速度也不会受到影响,算法效率有一定影响。
寻找最适合的方向,以及确定这个方向上OBB包围盒的最小尺寸,是构造OBB包围盒的关键。
OBB包围盒需要计算包围盒的尺寸、方向以及中心位置。
尺寸是计算位置和方向得到的,中心位置是用均值和协方差矩阵来计算的。
由于组成要进行碰撞检测的物体是多个三角形面,所以这里设三角形中第i个三角形面的定点矢量为为n,qi和ri,组成包围盒包围对象的三角形面数为n。
那么协方差矩阵元素Cjk的计算如公式4.4
式4-4包围盒的中心位置m
那么OBB的中心位置m计算如公式4.5:
式4-5协方差矩阵元素Cjk
其中,公式qi=q—m,ri=ri—m和pi=pi—m都是3*1向量。
利用上述公式得出矩阵的特征向量,并将其进行单位化,由于矩阵C的特征向量具有相互垂直的特点,所以矩阵C是OBB的方向轴。
要得到包围盒的尺寸,需要把包围对象在顶点方向进行投影操作,找出方向上的投影区间,计算出投影区间的尺寸,该尺寸就是包围盒的尺寸。
包围盒的简单性与其包裹几何体的紧密性是一对矛盾,包围盒越简单它对几何体的包裹紧密性就越差。
4.2.2BSP算法
BSPTrees英文全称为BinarySpacePartioningtrees,二维空间分割树,简称为二叉树。
BSP树原理很简单:
它将场景中所有的三角形面组织存储于一颗二叉树内,每个平面均将空间分为前后两个空间,这两个空间又被其它面分成更小的空间……直到最后,按照前面的算法,确定每个房间相对于摄像机的遮档顺序。
这是一个非常标准的二分法,仅按照“前”和“后”两个逻辑上的概念来划分空间。
如图4-2所示:
图4-2BSP原理简要解析图
空间ABC由A、B、C三个独立的空间组成,首先,分割平面1将空间分成了平面正向的A空间和平面负向的BC空间,BC空间被2紧接着分割为平面2正向的C空间和负向B空间。
如果一个人处于C房间内,那么如何判断空间的遮挡顺序呢?
从根结点开始,由于处于平面1的“后面”,所以,BC空间应该先于A空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OPENGL 技术 游戏 开发 研究 项目 报告