OGRE 2.1简明扼要的分析

link:http://www.aiuxian.com/article/p-2835471.html

据说OGRE 2.1 要追上商业引擎,还是比较期待。昨天下午下载了OGRE 2.1,HG然后CMAKE,看了一下代码,写点记录。


引擎=数据结构+算法+架构

架构=模块化(适合原型封装,简洁高效不够方便,更方便需要抽象)+抽象化(适合人类思维接口,需要合适的类抽象,但是会增加类依赖,类抽象不好很糟糕)+泛型化(类抽象后再抽象出模板,多类型共用一套代码和类型特化代码)+脚本化(无需编译,迭代快速,使用简单,动态灵活,应用层需要)

------------------------------------传说中的分割线--------------------------------------------

OgrePrerequisites.h 一般头文件包括这个公共头文件和自身需要的模块头文件


OgrePlatform.h 平台编译器相关定义

OgreConfig.h 引擎本身定义

OgreBuildSettings.h 项目模块Build定义

OgreStdHeaders.h 标准头文件定义
OgreMemoryAllocatorConfig.h 内存分配器定义

基础定义

版本定义

基本数据类型定义

类前置定义

内存基础定义

------------------------------------传说中的分割线--------------------------------------------

OgreStableHeaders.h  一般CPP包含这个稳定的公共头文件,减少rebuild,这个文件可以看出引擎基础模块

#include "OgrePlatform.h"
#include "OgreArchive.h"
#include "OgreAxisAlignedBox.h"
#include "OgreBitwise.h"
#include "OgreCamera.h"
#include "OgreColourValue.h"
#include "OgreCommon.h"
#include "OgreDataStream.h"
#include "OgreException.h"
#include "OgreFileSystem.h"
#include "OgreLog.h"
#include "OgreMath.h"
#include "OgreMatrix3.h"
#include "OgreMatrix4.h"
#include "OgreMovableObject.h"
#include "OgreNode.h"
#include "OgrePlane.h"
#include "OgrePrerequisites.h"
#include "OgreQuaternion.h"
#include "OgreResource.h"
#include "OgreSerializer.h"
#include "OgreSharedPtr.h"
#include "OgreSimpleRenderable.h"
#include "OgreSimpleSpline.h"
#include "OgreSingleton.h"
#include "OgreSphere.h"
#include "OgreStdHeaders.h"
#include "OgreString.h"
#include "OgreStringConverter.h"
#include "OgreStringInterface.h"
#include "OgreStringVector.h"
#include "OgreUserObjectBindings.h"
#include "OgreVector2.h"
#include "OgreVector3.h"
#include "OgreVector4.h"
#include "OgreWireBoundingBox.h"
#if OGRE_NO_ZIP_ARCHIVE == 0
#   include "OgreZip.h"
#endif

------------------------------------传说中的分割线--------------------------------------------

基本架构大体包括数学类,Root类,文件管理类,渲染类,场景类


Root单例类

提供一个引擎中心接口,包括其他管理器类,也包括渲染循环startRendering和渲染入口renderOneFrame


渲染组织

渲染循环,渲染一帧时,将更新所有的渲染输出目标RenderTarget。

RenderTarget对应渲染目标抽象,可以渲染输出到一张图(RenderTexture子类)和一个窗口RenderWindow(子类)。

RenderWindow对应输出窗口的抽象,RenderWindow可以有多个视口ViewPort,一个ViewPort对应一个摄像机Camera。

RenderSystem主要抽象封装引擎渲染的一般接口,来统一化使用3D API包括DX9,DX11,GL等。核心方法是_updateAllRenderTargets,在renderOneFrame时进行对象渲染。

RenderSystem渲染所有RenderTarget,RenderTarget会按优先级先后渲染。

RenderTarget按ZOrder更新它所有ViewPort,ViewPort调用Camera更新,Camera调用所属的场景管理器渲染场景scene。

场景管理器根据场景算法和Camera裁剪出场景渲染对象Renderable放入渲染队列RenderQueue进行渲染(SceneManager::_renderScene)。

渲染对象通过对象RenderQueue管理,它把渲染对象按材料Material分组渲染,减少渲染状态切换。

材料分组时分别按材料阴影技术特点分别渲染处理(_renderQueueGroupObjects),然后再按优先级分组处理,

再按渲染技术特性Technique分为如下六个技术特性组:

SolidsBasic:Solid pass list, used when no shadows, modulative shadows, or ambient passes for additive

SolidsDiffuseSpecular:Solid per-light pass list, used with additive shadows

SolidsDecal:Solid decal (texture) pass list, used with additive shadows

SolidsNoShadowReceive:Solid pass list, used when shadows are enabled but shadow receive is turned off for these passes

TransparentsUnsorted:Unsorted transparent list

Transparents:Transparent list

技术特性组再按Pass分组放入每个Pass渲染对象列表(Pass列表增减时排序)或者直接按camera距离(为了处理透明对象渲染)来排序放入一个渲染对象列表(由于距离变动列表每次需要排序),然后通过Visitor模式Visit渲染集合,按Visit标志渲染Pass渲染对象列表的每个Pass(Pass&Renderable)或者渲染camera距离渲染对象列表的每个对象的每个PASS(RenderablePass,RenderalbePass排序按先不同对象的距离比较,然后同对象Pass比较)。最后Visitor遍历每个对象Pass,交给场景管理器渲染单个对象Pass,单个渲染就是设置Pass,然后用Pass的Shader等,结合Randerable的Mesh数据渲染出来。


据说OGRE已经实现了比较底层的多线程渲染方式,没看太清楚,有看到渲染部分的OGRE_MUTEX,下回再分解吧。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值