李蕊 周民
摘要:近年过,随着图形硬件及图形接口的更新换代,用于游戏的实时图形引擎得到了突飞猛进的发展,各种开源引擎与商业引擎层出不穷。该文旨在运用计算机图形学理论知识,基于OpenGL 3.3的标准以及GLSL着色语言,使用C++语言编写和Visual Studio 2010平台,完成一个拥有模型载入、贴图载入、UI界面、地形系统以及人机交互系统的图形引擎,能够用于游戏场景与漫游类的应用。
关键词:引擎;OpenGL; GLSL
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)25-5960-03
Design and Implementation of Graphics Engine Based on OpenGL
LI Rui, ZHOU Ming
(Nanyang Institute of Technology,Nanyang 473000,China)
Abstract: In recent years, along with the graphics hardware upgrade, the development of graphical interfaces. Real-time graphics engine for the game has been rapid development. There have been many game engines.This paper aims to use the computer graphics theory, based on the version of the standard OpenGL 3.3, GLSL shading language, using the C++ language, Visual Studio 2010 platform, complete this graphics engine, with Model loading, Texture loading, User Interface, Terrain, as well as Interactive. It can be used for simple games, scene roaming applications and so on.
Key words: Graphics; engine; OpenGL; GLSL
从PONG开始游戏逐渐融入我们的生活。现在的世界,游戏已经无处不在,随着游戏画面的日渐逼真,游戏开发用到的技术日新月异,越来越多的人加入到游戏开发的行列中。图形引擎是游戏引擎中最重要的部分,游戏重要的技术突破也都是通过图形这个部分达到的。从最初的2D简单画面,到实时3D技术的应用,再到现在足以媲美CG的画质,图形学的技术可谓日新月异[1]。图形引擎用到的只是属于计算机图形学中的实时图形学部分,图形引擎是游戏引擎一个重要的部分,占据了游戏开发70%以上的比重,一个优秀的引擎能大大减少游戏开发的工作量。
该文研究了一个图形引擎的实现过程,以及这个图形引擎用到的技术,系统以计算机图形学概念作为基础,采用OpenGL3.3图形接口作为引擎的底层,使用OpenGL的glew库,glew能支持所有的OpenGL版本,并且能够使用GLSL着色语言。
1 设计游戏引擎的理论基础
OpenGL(Open Graphics Library)是一种与硬件、窗口系统和OS相独立的一系列API。它的前身是由SGI公司为其图形工作站开发的IRIS GL,是一个工业标准3D计算机软件接口。后来,为了实现向其它平台移植,开发了OpenGL。现在OpenGL由Khronos工作组负责OpenGL标准的指定。OpenGL不仅有Graphics Library的功能,而且是开放的,可用于多种硬件及操作系统[2]。
OpenGL本身并不是一个库或者是一个SDK,它并没有SDK,它是一个连接图形硬件的接口,我们使用Khronos或显卡厂商提供的核心函数或者扩展可以方便的控制显卡的工作,OpenGL帮助我们控制显卡,使得显卡可以按照我们的意愿显示图形[2]。OpenGL是一个状态机,以及客户/服务器(C/S)结构,不过这里的服务器指的是显卡,而服务存储器指的是显存,如图1所示。
2 需求分析
2.1模型对象的载入
图形引擎一个核心的部分就是将自己的模型在引擎中实时的显示出来。虽然模型对象都是点、面等图元信息,但是一般人绝对不会自己去一个一个点坐标写,而是使用常规的建模软件,制作模型,然后导出成需要的格式文件[3]。这些文件中存储着需要用到的数据。模型的载入就是从这些文件中读取数据,然后重新整合数据之后,显示在屏幕上,而模型的格式也不是一种,每种格式的数据存储方式又不同。模型分为静态模型,逐帧模型和骨骼模型。所以本引擎静态模型采用了应用最为广泛的obj模型格式。这个格式每一个建模软件都是可以导出的。
2.2材质的设置
材质作为模型对象表面属性的体现,同样是极其重要的。材质其中重要的属性是颜色与贴图,本引擎支持从obj格式文件中获取mlt格式的材质,并且如果材质存在会自动赋予材质,当然可以手动赋予材质。
2.3着色器设置
引擎中自建有默认着色器,在没有着色器设置的情况下,会自动调用默认的着色器。如果有用户创建的着色器,就会判断用户创建的着色器是否可用,如果可用就调用用户创建的着色器来渲染场景。
2.4界面系统
既然是实时的交互系统,用户会需要一定的交互功能,比如显示文字,按钮等控件。传统的winAPI虽然好用,但是并不是跨平台。系统需要提供一套适用的界面UI提供给用户使用。
2.5地形系统
引擎中支持使用黑白高度图生成地形,地形会自动设置每个顶点的法线,确保渲染效果正常。同时地形可以大量的拼接在一起,设置得当的地形可以实现无限地形的效果,地形也支持材质的赋予。
3 引擎系统的设计与实现
3.1引擎系统框架图
支撑引擎的是OpenGL与控制系统,OpenGL下又有分为着色程序(Shader)与缓冲对象。控制系统主要用来控制模型、材质、界面以及地形[4]。本引擎系统的框架图如图2所示:
控制系统用于控制OpenGL令其实现想要实现的功能。模型与材质甚至UI最后都会交给缓冲对象,由缓冲对象交给Shader之后再GPU中最后生成出想要的图像。
3.2功能模块设计
本引擎系统虽然是极限编程的思想,但是也没有抛弃模块化的设计。本引擎的模块分为6个、核心模块、着色程序模块、模型对象模块、材质模块、UI模块以及地形模块[5],如图3所示:
3.3窗口生成
引擎系统在执行的时候需要窗口的承载,OpenGL是不允许直接调用Windows的窗口系统,所以需要创建一个窗口。在Windows下创建窗口并获取窗口句柄,然后将OpenGL绑定在这个创建好的窗口上。本引擎只使用一个窗口,窗口被封装在一个类当中,可以随着需求修改窗口属性。同时实现了窗口在改变大小时,会横向按照比例缩放,比例的数值就是屏幕分辨率的数值
3.4着色器生成
窗口创建好之后初始化OpenGL,因为OpenGL初始化比较简单,不再贴出详细代码,随后生成内建着色程序,内建着色程序需要调用到OpenGL的句柄,而系统原则上不允许核心意外的模块调用OpenGL的任何函数,所以将会建立使用函數的借口,以方便与其他模块的连接。内建着色程序只有顶点着色程与片段着色,使用Phong光照模型,仅支持一个顶点缓冲器,每个模型仅支持一张贴图。
3.5模型读取
模型读取需要IO操作,通过IO流得到文件,并对文件进行分析,obj格式与MD5格式都是文本格式的模型文件,这里以obj格式模型为例
4 应用举例
引擎系统在执行的时候需要窗口的承载,OpenGL是不允许直接调用Windows的窗口系统,所以需要创建一个窗口。在Windows下创建窗口并获取窗口句柄,然后将OpenGL绑定在这个创建好的窗口上。窗口创建好之后初始化OpenGL,因为OpenGL初始化比较简单,不再贴出详细代码,随后生成内建着色程序,内建着色程序需要调用到OpenGL的句柄。模型读取需要IO操作,通过IO流得到文件,并对文件进行分析。当模型读取完成之后,我们就可以尝试读取一个模型,如图4所示,这是一个拥有40万个面的模型,一共向我们展示了四架飞机,左上角是通过Fraps测试的刷新率。可以看出基于VBO与VAO的模型读取之后使用时效率十分高。
6 小结
本文的主要内容是引擎系统的编码与实现过程。这里主要描述了核心模块窗口在Windows下依赖Windows窗口句柄创建窗口并绑定与OpenGL,引擎内置着色器生成,以及缓冲对象的建立。着色程序模块会给用户创建着色程序提供便利,非常方便的加载以及非常快捷的参数传递。模型对象模块可以方便的读取模型,并且传递给核心,让核心生成相应的VBO缓冲器。界面模块依赖于panel这个基类,所有的控件类都会继承这个基类,最后跟鼠标键盘事件结合,构成良好的界面模块。粒子模块会根据需要高效的生成与显示粒子,并且赋予相应贴图表现出特定的效果。地形模块通过给出的高度图生成地形模型,并且可以选择性的绘制地形的质量。引擎中还存在一些智能算法问题,有待进一步研究。
参考文献:
[1] Khronos Group.OpenGL wiki百科[EB/OL].http://zh.wikipedia.org/wiki/OpenGL,2012.
[2] 刘志强.基于OpenGL的三维游戏引擎的研究[D]. 天津:河北工业大学,2008:11-21.
[3] Donald Hearn,M.Pauline Baker.计算机图形学[M].3版.北京:电子工业出版社,2010.
[4] 林巧民,林萍,王汝传.基于OGRE的智能游戏引擎的设计与实现[J].南京邮电大学学报:自然科学版,2010(30):71-76.
[5] Richard S.Wright,Jr.,Nicholas Haemel.OpenGL超级宝典[M].5版.北京:人民邮电出版社,2012.