由于工作需要,花费了一段时间研究OGRE,但是研究的目的是要在vs2010平台下用c#进行MOGRE的开发,不得已才转到MGRE,步骤是首选熟悉MOGRE的一些基础知识,做到在winform下能用MOGRE单独开发项目,最终的目的不仅限于此,而是构建一个MOGRE和physx结合的一个开发平台,以便在此基础上能够运用vs和.net快速的开发项目。ogre是在c++环境下开发的,而mogre几乎完全是由c++语言转换为c#的结果。此处,首先介绍ogre是什么,大家为什么会用到它。
OGRE(Object-Oriented Graphics Rendering Engine,即:面向对象图形渲染引擎)是一个用C++开发的面向场景、非常灵活的3D引擎,它旨在让开发人员更容易、更直接地利用硬件加速的3D图形系统开发应用。它的类库隐藏了底层系统库(如:Direct3D和OpenGL)的所有细节,提供了一个基于世界对象和其他直观类的接口。有人会说ogre是一个游戏开发引擎,这里明确回答不是。OGRE能被用于开发游戏,但是OGRE被设计成一个只提供世界级的图形解决方案;对于其他的特性,如:音效、网络、人工智能、碰撞检测、物理等子系统,你则需要将其整合到OGRE中,在这些子系统中,已有一些成熟的库可供选择。而本人在此处也是寄希望与mogre与physx完美融合。
OGRE亮眼之处:场景图和场景内容的分离。是因为:
在传统设计中,将场景内容和场景结构放到一个继承体系中,并将场景内容生硬的作为场景节点的子类,这是一个极其失败的设计方案。如果不修改所有的子类,基本上是没有办法更改或者扩充图形算法的,因此让修改基类的接口非常困难,进而导致以后的维护工作变得举步维艰。此外这种“所有节点源自同一节点类型”的设计思想会让整个程序变得凝固且难以复用(至少从维护的观点看):当增加新的基类功能方法或者属性的时候,不管是否真的需要,这些都强迫的塞入所有子类。最后导致哪怕是对基本功能做很小的修改,都会牵一发会动全身, 导致开发维护最终变得难与控制。
Ogre对场景图的操作维持在接口级别;它并不关心去操作图形的具体算法实现。换言之,Ogre只是通过信号(它们的方法)来操作场景图,进而忽略了具体的算法实现。其次,Ogre的场景图接口只负责维护场景结构。节点中没有包含任何固有的内容和管理方法。具体的内容被放置到一种可渲染(Renderable)对象之中,它提供了场景中全部几何图形(包括活动的的或者其他所有的)。它们的渲染的属性(也可以说是材质)被包含在实体(Entity)对象中,在实体对象里面同样包含着一个或多个子实体(SubEntity)对象,这
些子实体才是是真正可以被渲染对象。它的场景图和场景关系可以用下图表示:
OGRE的一些组成部分:
资源管理:
资源在Ogre中的定义是“所有渲染几何体到渲染目标的数据所需要的数据”。这不仅包含模型,骨骼,材质,还包含表层(Ovelary)脚本和字体,以及有材质处理所需要的一些资源,比如合成器框架脚本、GPU程序和纹理。
Ogre同时有手动载入和隐式载入两种不同的载入方法:手动载入指的是在代码中通过接口来载入相应的资源,其中包括字体和模型这种资源,在需要使用前需要执行一些代码来载入和初始化。而对于其他一些资源来说,在载入配置文件的时候就已经被预先载入了,其中包括经常使用的纹理资源。
合成器后处理技术(Compositor Postprocessing)
合成器框架(Compositor framework)是Ogre新加入的一个特性,它允许用户在视口(Viewport)级别实现全屏的二维后处理(Postprocessing)特效。例如,你可以把视口中全屏的内容实现的发光或者朦胧处理、黑白渲染、锐化边缘渲染。任何你能想象的对整个视口的操作都可以在合成器框架中实现。
框架的处理方式极其类似材质脚本系统。其中合成器中的技术(Technique)概念和材质脚本中的渲染技术概念一样,都是指的达到某种特效所能使用的不同方法。合成器中的通路(Pass)也和材质脚本中的渲染通路有类似概念,既在创建视口最后的输出之前进行的多次运算或者过滤过程。并且合成器框架也提供了和材质脚本一样的自动回调技术来保证最终输出的像素各式可用。
合成器脚本的是针对于视口的操作,这就意味着你可以把这些特效应用于任何渲染目标,其中包括渲染到纹理,渲染到主窗口或者里面的子窗口。不论后面是否有已经存在的几何体,最终的渲染结果都很好的显示到表层的矩形的视口中。例如你可以把一些物体渲染在屏幕之外,然后把经过后处理的结果通过渲染到纹理在主屏幕中显示。
和材质脚本一样,合成器框架也可以直接从代码中直接创建。你可以在代码中使用一切可以在基本中存在的属性和方法。合成器框架也有同材质脚本一样的“主题(Scheme)”概念,事实上,合成器框架中的主题操作是通过材质主题来实现的。
Ogre支持动画方式:骨骼动画(Skeletal)、变形动画(Morph)以及姿态动画(Pose)
骨骼动画是通过把顶点绑定到骨骼的骨头(Bone)上来实现的(也被称为矩阵调色蒙皮技术,或简称为蒙皮技术)。在物体上的每个顶点都可以同时被四块独立的骨头影响,影响的具体力度取决于顶点对每块骨头分配的权重,当骨骼运动的时候,所有被它影响的顶点都根据骨头的位置和权重来更新自身的位置。这种算法可以模拟很多现实的顶点位移,例如可以很好的模拟在移动的胳膊的时候肩膀的外型的变化(更确切地说,因为当胳膊抬起的时候肩膀相应的肌肉会收缩)。目前Ogre还只能支持关键帧形式的正向动力学(FK)骨骼动画;也就是说没有提供对逆向动力学(IK)骨骼动画的内建支持;如果你的美工在3D模型工具中使用了逆向动力学产生相应的动画,这时候可以对骨骼每一帧进行采样来转换成正向动力学的骨骼动画。通常来说,这些工作都可以在导出插件中很好的完成
变形动画与姿态动画都属于顶点动画技术。变形动画存储了顶点在每一关键帧的绝对位置,然后在运行时对两个位置进行相应的插值计算,因为多个顶点的绝对位置无法叠,所以多个变形动画之间无法相互混合成新的动画。而姿态动画的不同之处在于它储存的是顶点的相对位置,因此多个姿态动画的轨迹可被混合起来,进而创建出更复杂的顶点动画。不过上面两种类型的动画都可以与骨骼动画很好的混合使用。
到此,对ogre有了一个大致的认识,现在有点摩拳擦掌的意思,但是在这之前需要配置好mogre运行环境,才能进行mogre的学习。
1下载并安装
a) VS2008、vs2010安装上SP1补丁
b) 运行库 vcredist_x86.exe
c) DirectX
d) Mogre SDK
2 配置环境变量:
控制面板-系统和安全-系统-高级系统设置-系统属性-环境变量-系统变量,path路径后面添加
C:MogreSDKin elease;C:MogreSDKindebug
创建一个Mogre C#程序
- 新建一个Winform项目
- 添加两个引用(C:MogreSDKinRelease下的Mogre.dll,MogreFramework.dll)
- 打开Program.cs,using两个dll
- 拷贝C:MogreSDKinRelease下的所有CFG文件至Winform项目下的binDebug、binRelease文件夹(如果Release文件夹不存在,可以创建一个;或者把项目在Release模式下运行一下,即可生成)
- 修改拷贝过来的CFG文件,将其中的相对路径改为绝对路径。涉及到的文件有:
a) Plugins.cfg:”PluginFolder=.”修改为” PluginFolder=C:MogreSDKinRelease”
b) Quake3settings.cfg:” Pak0Location: ....mediapackschiropteraDM.pk3 Map: maps/chiropteradm.bsp”修改为” Pak0Location: C:MogreSDKmediapackschiropteraDM.pk3 Map: maps/chiropteradm.bsp”
c) Resources.cfg:所有的”../..”修改为”C:MogreSDK”
6在Main()方法中添加代码即可运行
7 备注:如果是.net 4.0以下,可以直接运行成功;如果是.net 4.0,则会报错,解决办法是添加一个app.config,然后在里面的configuration中添加子节点
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
对于mogre环境的搭建以及如何创建第一个mogre的c#项目,都要感谢我的同事×××,正是由于他的努力,少走了很多弯路,在此表示感谢。