据说OGRE 要追上商业引擎,还是比较期待。昨天下午下载了OGRE,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数据渲染出来。