OGRE简析
- 格式:docx
- 大小:32.02 KB
- 文档页数:6
OGRE简析(一)------OGRE SampleBrowser框架解析“伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧”这是OGRE中文网的一则广告,我想,无论作为OGRE的学习者还是漫漫人生的一名旅人,这句话都是非常不错的激励语。
放在这,是否能够让你隐约看到属于自己的新世界?简介Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。
OGRE 主要提供渲染引擎,但是在系统API,文件管理以及范例中都提供的非常丰富的接口和范例,在设计模式上也有很多考究,代码书写的也比较规范,无论是作为使用还是学习,都有着非常不错的价值。
OGRE整体不算小,目前支持Windows、Linux、IPHONE、MAC、SYMBIAN五个平台,作为一个学习三维的新手来说,个人认为难度还算不小。
当你运行范例框架时,在惊诧其界面绚丽之余,多少很有一点无从下手。
而且OGRE也借助了不少第三方库,其范例界面俨然就是一个典型的Windows游戏界面,对于没有接触过的人们来说,和在.Net下的界面开发有很大的不同,这也加大的初学的难度。
如果仅看一个一个的局部案例而缺乏对整体框架的理解,又难免有管中窥豹之遗憾。
本文主要是针对范例框架部分的介绍,涵盖范例框架启动、显示和其后的UI界面操作部分。
针对范例框架,分析了OGRE在初始化、创建窗口、鼠标键盘事件响应、资源加载以及范例加载、渲染显示这几个模块的技术实现,另外对这几块所用到的框架和设计模式进行了总结。
算是对所学知识的总结,也方便接下来对案例所涉及的三维细节技术的研究。
备注:OGRE下载编译参考SampleBrowser范例Ogre范例写的很简单,main函数中仅有如下两行OgreBites::SampleBrowser sb; sb.go();可见,范例完全封装在SampleBrowser类中,只需要调用一下go函数即可。
但这两句话的效果却非常丰富,展现给我们一个交互式的范例展现界面,期间经过了root的初始化、窗口的创建、鼠标键盘事件的绑定和监听,系统资源的加载、范例程序的加载等,旅途可谓丰富多彩,期间无论是框架还是技术细节实现,都值得学习和推荐。
不妨现在就开启此次旅途第一站。
范例简析createRootOgre::Root* mRoot是SanmpleBrowser最重要的成员变量,和三维相关的渲染引擎、窗口、以及事件监听都是有其实现的,并完成整个过程的驱动,数据更新和渲染。
SanmpleBrowse启动的第一步,就是Root类的构造,Root相当于OGRE的地基,渲染场景和引擎、以及各种文件系统的管理和加载都是在Root构造函数完成的,代码相对简单明了,如果对UGC插件机制了解的话,插件加载等方式也基本一致,相对难度不大。
Root构造函数主要进行了:1.Manager初始化(DynLibManager插件管理、ArchiveManager文件管理、ResourceGroupManager资源文件管理、OverlayManager管理)2.具体文件系统的加载(普通文件、zip)3.窗口的初始化(mAutoWindow = 0)4.插件加载(loadPlugins(pluginFileName),渲染引擎的加载)其后会根据配置文件设置Root的属性,最关键的是设置渲染引擎类型(OpenGL、D3D)createWindow在Root构造之后,便开始窗口的初始化创建过程,其本质是调用Root函数的initialise()函数,返回RenderWindow的窗口指针。
Initialize函数调用非常方便,但内部处理还是非常复杂,关键成员对象如下:●Rendersystem(GLRenderSystem)●GLSupport(Win32GLSupport)●RenderWindow(Win32Window)●Win32Context其中,Rendersystem就是GL的渲染引擎,Win32GLSupport负责屏幕相关的大小,位深,像素等信息的传递,而Win32Window则负责调用Win系统函数来实现窗口的创建,以及与OpenGL建立关联,而Win32Context则用来存储创建窗口后的句柄等信息,函数大致过程如下:mRoot->initialise(true, "OGRE Sample Browser");-> Rendersystem _initialise->mGLSupport->createWindow(Win32GLSupport)-> Win32GLSupport::newWindow->Win32Window.create-> mContext = new Win32Context(mHDC, mGlrc);Win32Window.create函数中,在CreateWindowEx创建窗口后,通过wglCreateContext和wglMakeCurrent,将OpenGL与窗口的HDC建立关联,而Win32Context用来存储此句柄如上,一个空白的Windows窗口创建完成。
setupInput窗口创建完毕后,下一步就是鼠标键盘事件的处理了,在OGRE中采用了OIS开源库来负责打理相关事务,OIS库专门用来处理外部设备(键盘、鼠标、操纵杆、触摸屏)和程序之间的,而且支持跨平台,在游戏程序中还是非常实用的。
另外分析一下SampleContext类,继承自FrameListener,WindowEventListener,KeyListener,MouseListener四个类,FrameListener用来监听OGRE三维渲染中的事件响应,WindowEventListener 则用来监听Windows消息事件,而后两者则处理程序内部事件响应。
OIS主要文件有三类:●OISInputManager统一处理外部设备的管理类●OISKeyboard负责键盘事件的处理类●OISMouse负责鼠标事件的处理类使用时,调用OIS::InputManager::createInputSystem返回OIS::InputManager管理,核心函数为DirectInput8Create函数,虽然在msdn中都没有此注释,可不要小看这个函数,用于创建和Win下外部设备交互的管理对象,封装成OIS的InputManager返回给用户来管理。
由InputManager创建出对应的鼠标键盘对象。
在使用中,可大致分为三个模块来实现外部设备的响应:●外部事件的响应WindowEventUtilities::messagePump(),用来接收系统事件,比如激活当前窗口,关闭,窗口变化等等,处理程序之间的消息事件●在OGRE渲染过程中,之前将SampleContext类添加到Root中进行监听(mRoot->addFrameListener(this)),实时渲染中renderOneFrame会调用监听类的captureInputDevices,分别处理键盘和鼠标类的响应(mKeyboard->capture(),mMouse->capture();)●在鼠标和键盘监听中,会在capture中分析当前的行为(鼠标移动,按键操作等),最终在SampleBrowser中实现响应操作如上,通过监听类和OIS开源库,采用回调函数,实现了外部设备和程序的交互操作Loadresources之后是加载范例中所用到的资源文件,也是是程序加载过程中显示进度条的过程。
此时主要是由SdkTrayManager、OverlayManager和ResourceGroupManager来处理,前者用来负责界面进度条更新,OverlayManager用来负责界面显示部分,后者用来加载资源。
首先构造进度条,进度条和其描述内容都是通过构建OverlayElement完成。
OverlayElement是一个非常有用的界面显示元素,有点类似Dreamweaver中的层的作用,一些在屏幕中界面元素,比如游戏视角中的驾驶舱,指南针等相对影像不变的部分,都可以以OverlayElement的形式来体现。
OverlayElement本身有一些固定模板,也可以通过配置文件的形式来构建,可见,OverlayElement在游戏中是一个非常常用的对象。
SdkTrayManager构建完界面元素对象后,则加入到ResourceGroupManager中进行监听,而在ResourceGroupManager中会加载resources_d.cfg中包含的资源文件,分为二进制和zip压缩文件两种,每次解析文件时通过监听机制,对SdkTrayManager进行数值更新,而SdkTrayManager 则驱动RenderWindow更新(renderwindow->update)Root中Render渲染过程:分为Update和Render两部分,但均在一个线程下完成,在一系列Update后,最终调用GLRenderSystem的Render,完成此帧的渲染,其顺序大致如下:renderwindow->update-> rendertarget update-> SceneManager Update RenderQueue-> SceneManager::renderSingleObject-> GLRenderSystem::_render(const RenderOperation& op),详细的就不多说了,这也是今后研究的重点了。
最后,资源加载完,设置进度条对应了Overlay为不可见,则资源加载过程完毕。
SampleLoad资源加载完毕后,则开始导入具体范例,生成Sample对象来统一管理范例。
setupWidgets()则负责完成范例界面相关的部署OGRE对范例也定义了一系列规范采用插件的方式来加载范例,最终由mLoadedSamples容积保存。
mThumbs负责存储范例的缩略图容器,本身也是Overlay的容器集合。
在范例加载完成后,OGRE的界面显示过程宣告结束,这时用户通过键盘鼠标的外部输入来进行范例的选择。
同样通过OIS来进行维护,判断键盘的上下移动,更新显示内容。
框架解析OGRE上述过程只是冰山一角,但就复杂度来说也不低,得益于OGRE的框架设计,OGRE 在使用中设计的非常优良,在实现最初就做过很多好的设计模式,而且定义的很规范,这些程序员对C++编码经验可谓非常丰富。