- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于OpenGL简易图形引擎设计与实现
基于OpenGL简易图形引擎设计与实现
一、绪论
从PONG开始游戏逐渐融入我们的生活。现在的世界,游戏已经无处不在,随着游戏画面的日渐逼真,游戏开发用到的技术日新月异,越来越多的人加入到游戏开发的行列中。图形引擎是游戏引擎中最重要的部分,游戏重要的技术突破也都是通过图形这个部分达到的。从最初的2D简单的画面,到实时3D技术的应用,再到现在足以媲美CG的画质,图形学的技术可谓日新月异。图形引擎用到的只是属于计算机图形学中的实时图形学部分,图形引擎是游戏引擎一个重要的部分,占据了游戏开发70%以上的比重,一个优秀的引擎能大大减少游戏开发的工作量。
二、引擎系统设计
(一)引擎系统框架图
支撑引擎的是OpenGL与控制系统,OpenGL下又有分为着色程序(Shader)与缓冲对象。控制系统主要用来控制模型、材质、界面以及地形。本引擎系统的框架图如图1所示:
控制系统用于控制OpenGL令其做我们想做的事情。模型与材质甚至UI最后都会交给缓冲对象,由缓冲对象交给Shader之后再GPU中最后生成出我们想要的图像。
(二)功能模块设计
本引擎系统虽然是极限编程的思想,但是也没有抛弃模块化的设计。本引擎的模块分为6个、核心模块、着色程序模块、模型对象模块、材质模块、UI模块以及地形模块如图2所示:
(三)功能模块描述
1、核心模块。核心模块是整个图形引擎的核心,其中包括窗体生成,鼠标键盘事件,OpenGL初始化,OpenGL缓冲对象的封装,内置Shader的封装。它能够在不依赖其他模块的情况下独立使用。
2、Shader模块。Shader模块是用于加载自建Shader程序,Shader模块提供Shader代码源自文件的载入,Shader程序的连接,以及Uniform外部变量的分类设置与外部变量的实时更新。不过其必须通过核心模块加载Shader模块才能发挥其作用。这为以后增加对Direct3D支持提供了便利。
3、模型对象模块。模型对象模块是用来读取外部模型,并且计算外部模型的顶点数、面数,模型对象模块会计算出模型所处的范围,并且改变模型的位置,旋转模型的方向,以及缩放模型的大小。最后可以将变形之后的模型数据再次导出。同时对象模块也必须依赖核心模块才能使用,对象模块只是对模型数据进行处理,不与OpenGL发生直接联系。
4、材质模块。材质模块用来控制模型对象的材质。其中包括漫反射贴图,法线贴图,高光等。材质模块会将相应模型对象的属性传递给核心模块,核心模块会调用内置Shader或者是调用Shader模块的Shader进行渲染,相应的对象就能与材质相联系。
5、界面模块。界面模块用于控制程序的界面。界面分为按钮、下拉框、滚动条等控件,控件的显示是依靠面片与贴图结合实现,界面模块使用了freeType字体库生成字体纹理,字体也是控件的一种,与控件相互组合最终生成完整的界面。界面模块依旧依赖核心模块,特别是核心内置Shader中预留了一个用于UI显示的Shader,方便UI显示。
6、地形模块。依赖.tga格式读取的图片文件,一方面用于纹理的绘制,另一方面用于地形系统。高度图是一种灰色的纹理图,在读取的时候我们只需要RGB的第一个R值即可,利用R值乘以地形系统的高度分量得出高度,再通过位置的分量与纹理坐标得到点在平面上的坐标,与分量结合,得到点的位置。
三、引擎系统编码与实现
(一)核心模块编码及详细实现过程
1、窗口生成。引擎系统在执行的时候需要窗口的承载,OpenGL是不允许直接调用Windows的窗口系统,所以需要创建一个窗口。在Windows下创建窗口并获取窗口句柄,然后将OpenGL绑定在这个创建好的窗口上。本引擎只使用一个窗口,窗口被封装在一个类当中,可以随着需求修改窗口属性。同时实现了窗口在改变大小时,会横向按照比例缩放,比例的数值就是屏幕分辨率的数值。
2、着色器生成。窗口创建好之后初始化OpenGL,因为OpenGL初始化比较简单,不再贴出详细代码,随后生成内建着色程序,内建着色程序需要调用到OpenGL的句柄,而系统原则上不允许核心意外的模块调用OpenGL的任何函数,所以将会建立使用函数的借口,以方便与其他模块的连接。内建着色程序只有顶点着色程与片段着色,使用Phong光照模型,仅支持一个顶点缓冲器,每个模型仅支持一张贴图。
(二)着色程序模块编码及详细实现过程
1、着色程序文本读取。着色程序需要从外部文本文件中读取程序的代码段,着色程序绝大部分情况下一行不会超过256个字符,读取的时候通过循环读取一行最多256个字符,遇到换行符就停止转入下一行的方式,当遇到文件结尾符时循环停止。然后给每一行结尾
原创力文档


文档评论(0)