OGRE内部渲染循环
来源:互联网 发布:学会plc编程工资高吗 编辑:程序博客网 时间:2024/06/06 08:29
【 OGRE 的渲染循环框架】
OGRE通过WinMain或main调用go再通过Root调用startRendering进行消息循环,然后调用renderOneFrame,通过RenderSystem的_updateAllRenderTargets方法,更新所有的RenderTarget。RenderTarget通过update方法更新与之关联的Viewport并产生FPS统计信息。而Viewport则调用与之关联的Camera的_renderScene方法进行渲染,Camera此时把“球”踢给SceneManager。进入SceneManager的renderScene成员函数中后,在经过计算后,把需要渲染的场景送给RenderSystem去做真正的渲染,此时我们可以看到熟悉的_breginFrame和_endFrame。一直下去经过RenderQueue、RenderQueueGroup、RenderPriorityGroup、QueuedRenderableCollecti
以下是渲染循环的时序图:
如图,可以清晰明确的看出来Ogre的渲染循环是怎样的了,其自从startRendering以后就一直以RenderSystem为基点开始渲染循环,,因为Render部分操作比较多而中间涉及了从Renderable到RenderOpretion(个人觉得可以看作是从Ogre引擎的层面到基本图形绘制层面的转化,所以是很重要的一环)的过渡,所以理解Ogre 的渲染顺序是十分重要的,这样可以理解Ogre怎样通过内部循环实现了逐帧按序渲染,而且不失为理解OGRE 的系统结构的一个好方法。
【Ogre中的Renderable(可渲染对象接口)】
Renderable对象是OGRE中所有可渲染对象的抽象接口。这个接口的实现类必须是基于单一的材质、单一的世界矩阵(或者是一组通过权重混合的世界矩阵,以及单一的渲染操作。
通过这个说明。要明确的是Renderable封装了3D世界中被渲染对象的基本属性而后数据,包括:渲染操作,材质属性,光照信息,变换矩阵(四元组),LOD信息,渲染方式等信息。这些信息在渲染循环中被取出,并应用在图形渲染管线中。需要注意的是RenderOperation(渲染操作)对象,它封装了图形硬件的顶点数据和渲染的图元类型,在最终的渲染操作中使用这些数据来进行图元渲染,值得注意的是RenderOpration中的保存的顶点信息的类VertexData中是抽象的,它包含了一组硬件顶点缓存数据对象-HardwareVetexBuffer,这个类是从HardwareBuffer中继承过来的,这个类包括了Hardware buffer中的抽象操作方法,这里使用了模板方法和抽象工厂的设计模式,每个具体的渲染系统可以实现自己的硬件缓存数据。当然,这其中也有HardwareBufferManager,而且具体的渲染系统也要实现这个类,来创建具体的渲染系统相关的数据缓存。
【Ogre内部几个重要对象】
l
l
l
l
l
l
OGRE通常将可渲染对象分为2组,一是在世界中移动的离散的及其相关小对象,一种是大规模的杂乱的通常组成静态场景的对象。
Mesh和Submesh处理哪些在离散的可移动对象中使用的图元定义。Entity在世界中是真正的基于这种图元对象的实例,因此对于一个汽车来说它就是一个独立的网格集合,但是在世界中可以有多个基于相同网格集合的实体,这些实体可以改变网格的外在表现,例如通过改变材质属性(这样你就可以再相同的图元数据上用不同的纹理来拥有不同的小汽车)。为了这个目标,因为Mesh被分成了多个SubMesh,所以实体类是一个分组的类(与Mesh类很相似)并且相关的独立的个体改变的细节信息被保存在SubEntity类中,这是1:1的关系,Entity与SubEntity及其关联的Mesh和SubMesh。
实体和子实体都不会被直接的创建出来,用SceneManager的CreateEntity(传递一个模型的名字)方法来创建它们。
实体是被关联它们的场景节点对象包含在场景中的,使用attachEntity方法关联,参照SceneNode类的说明获取完整的信息。
l
l
l
【Renderable详解】
RenderQueue的类和数据类型关系图:
【RenderQueue结构图】
具体来说,OgreRenderQueue是如下的一个类(RenderQueue本身隶属于场景管理器(SceneManager)对象,一个场景管理器拥有一个RenderQueue对象):
class _OgreExport RenderQueue : public RenderQueueAlloc
}
可以看到其内部有一个RenderQueuGroup的Map,RenderQueueGroup表示具有固定编号的渲染队列组,其固定编号通过OGRE中的RenderQueueGroupID枚举变量定义如下:
enum RenderQueueGroupID
(可以看出按照优先级从大到小(枚举ID从小到大排序)下来的渲染顺序和图形学中算法是一致的)。每一个RenderQueueGroup对象拥有一个上述枚举变量中的ID,用来标识这个渲染队列组的处理优先级(知道为什么用MAP了吧)。
从结构图上可以看出QueuedRenderableCollecti
- OGRE内部渲染循环
- OGRE 内部渲染流程
- OGRE自定义渲染循环实现
- OGRE自定义渲染循环实现
- Ogre内部渲染流程分析系列
- Ogre内部渲染流程分析系列
- Ogre内部渲染流程分析系列
- Ogre内部渲染流程分析系列
- Ogre内部渲染流程分析系列
- OGRE 渲染状态管理
- Ogre渲染目标
- OGRE 渲染 到 MFC
- Ogre的渲染系统
- OGRE 渲染流程
- Ogre主要渲染流程
- ogre渲染流程
- OGRE渲染对象
- Ogre渲染到纹理
- Maven的依赖
- Ogre动画系统回顾
- OGRE+vs2010编译CEGUI SDK
- Ogre wizard standard Application…
- OGRE中使用CEGUI【1】
- OGRE内部渲染循环
- OGRE地形初步
- LOD地形绘制
- 我的博客今天3岁240天了,我领取了…
- OpenCV学习笔记(一) OpenCV的概…
- OpenCV学习 (二) OpenCV基本操…
- 各种希腊字母念法
- DCM,PLL和MMCM的区别
- C#域与属性