转自:http://blog.csdn.net/yanonsoftware/article/details/1041396

首先一个Entity对象必须Attach到一个SceneNode。

1.创建一个SceneNode: SceneManager::getRootSceneNode() (在SceneManager::init时会创建一个RootNode)
à SceneNode::createChildSceneNode()
àNode::createChild() 主要的操作在这个函数中完成,首先调用虚函数SceneNode::createChildImpl(),此函数又会调用OctreeSceneManager::createSceneNode(),此函数会new一个SceneNode的派生类对象,这里是OctreeNode,并加入到SceneNodeList mSceneNodes中;随后又进行了坐标变换;最后将此指针又加入到ChildNodeMap mChildren中,然后返回此指针;
2.将Entity Attach到SceneNode:SceneNode:: attachObject();
3.渲染从Root::startRendering()函数开始,此函数启动一个循环,每次执行Root::renderOneFrame()
àRoot::_updateAllRenderTargets
àRenderSystem::_updateAllRenderTargets()
àRenderWindow::update()
àD3D9RenderWindow::update(bool swap)
àRenderTarget::update()
àViewport::update()
àCamera::_renderScene()
à SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)
4.绕了好大一圈,才来到了SceneManager::_renderScene(),此函数想必是渲染的主要操作所在;
5.SceneManager:: _updateSceneGraph()从root node开始递归的调用了所有scene node的update,主要是计算了transform;
6.给AutoParamDataSource设置了一系列参数,这个类是用来为gpu programs提供一些参数的;
7.SceneManager::prepareRenderQueue()。这里有一个Ogre场景管理的概念RenderQueue。粗略的看,这个类主要是为了把Objects按照材质分组,它还将管理对象的渲染优先权;
8.OctreeSceneManager::_findVisibleObjects()
à OctreeSceneManager::walkOctree
à OctreeNode::_addToRenderQueue 如果想显示包裹盒的话,则会调用” sn->_addBoundingBoxToQueue(queue);” 可见这个操作利用SceneManager的空间管理算法来对所有的SceneNode进行了可见性判断,如果可能可见,则加入到RenderQueue中;
9.在计算好了RenderQueue之后,开始调用RenderSystem的一系列函数,例如_setProjectionMatrix等等开始为真正的渲染操作做好准备;
10.SceneManager::_renderVisibleObjects,渲染操作就在这里了。
àSceneManager::renderVisibleObjectsDefaultSequence
à SceneManager::_renderQueueGroupObjects
à SceneManager::renderBasicQueueGroupObjects(此函数遍历RenderQueueGroup中的每个RenderPriorityGroup,然后先渲染solids,再渲染transparents)
à SceneManager::SceneMgrQueuedRenderableVisitor::visit
11.  à SceneManager::renderSingleObject,此函数设置了灯光、GPU programs,然后使用一个RenderOperation对象来调用D3D9RenderSystem::_render,也就是真正的Draw call。RenderOperation对象是由SubEntity::getRenderOperationà SubMesh::_getRenderOperation来设置的,主要是IndexData和VertexData。
这里有几个细节需要注意:
1.在SceneManager::renderObjects函数中用到了一个visitor模式来访问QueuedRenderableCollection(这个类的实例用来在RenderPriorityGroup中包括solids、transparents等等)。
2.Entity是从MoveableObject派生的,而SubEntity才是从Renderable派生的;
3.一个SceneNode可以Attach多个Entity;实际上SceneNode可以Attach任何的MoveableObject;
4.前面只提到了IndexData和VertexData,而对于渲染来说Material更是关注的焦点,Mesh的材质是如何与RenderSystem交互的呢?
 
总结:SceneManager进行可见性判断之后,形成一个RenderQueue,然后对于队列中的每个Object再使用RenderOpertation与RenderSystem联系,来执行渲染操作。总体感觉有些地方相当复杂,有些觉得比较罗索,例如通过root然后找到RenderTarget然后知道ViewPort,再找到Camear,最后才执行到SceneManager的渲染函数,为什么不把ViewPort做完SceneManaer::_renderScene的一个参数,交给上层来控制呢?毕竟多数程序要一个RenderWindow,一个ViewPort就够了。又比如RenderQueue(见下图),不知道是不是因为要处理Shadow等才搞得这么复杂。
  对于Objects按照Material分组,然后对于每个Group再先显然Solids再渲染transparents,这种透明处理方式明显是不安全的,如果两个组中都有透明物体,那画面肯定会出问题的。

Oge中Mesh的渲染流程详述的更多相关文章

  1. NGUI渲染流程

    1 渲染流程 NGUI的渲染流程其实就是把Widget组件生成Mesh所需要的缓存数据,然后生成对应的DrallCall组合对应数据,生成渲染需要的Mesh数据,提交渲染. Widget(数据) UI ...

  2. NGUI 渲染流程深入研究 (UIDrawCall UIGeometry UIPanel UIWidget)

    上图是一个简要的NGUI的图形工作流程,UIGeometry被UIWidget实例化之后,通过UIWidget的子类,也就是UISprit,UILabel等,在OnFill()函数里算出所需的Geom ...

  3. Ogre内部渲染流程分析系列

    come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...

  4. Ogre2.1 Hlms与渲染流程

    在我前面三篇说明Ogre2.x的文章里,第一篇大致说了下Hlms,第二篇说了下和OpenGL结合比较紧的渲染,本文用来说下Hlms如何影响渲染流程中,因为有些概念已经在前面二文里说过了,本文就不再提, ...

  5. 转:Ogre内部渲染流程

    以下是 Ogre 的代码中的详细说明: Renderable是OGRE中所有可渲染对象的抽象接口 这个接口抽象出了在渲染管线中的被分组的离散的可渲染对象基本的方法. 此接口的实现类必须是基于单一的材质 ...

  6. cocos2d-x渲染流程

    Cocos2Dx之渲染流程 发表于8个月前(2014-08-08 22:46)   阅读(3762) | 评论(2) 17人收藏此文章, 我要收藏 赞2 如何快速提高你的薪资?-实力拍“跳槽吧兄弟”梦 ...

  7. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

  8. D3D渲染流程--转载

    http://www.cnblogs.com/ixnehc/articles/1282350.html 先从最基础的写起吧,关于Device的渲染流程. D3D9的Device就是D3D给我们提供的一 ...

  9. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

随机推荐

  1. Nginx内置常用变量

    nginx用到的全局变量 $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值. $args #这个变量等于请求行中(GET请求)的参数,例如foo=123&a ...

  2. 面试时,问哪些问题能试出一个 Android 应用开发者真正的水平?【转自知乎】

    这几年面过的各种Android开发也有三位数了,failed的不敢说,pass的基本都没有看走眼,来得晚了也想说说我的体会. 一般面试时间短则30分钟,多则1个小时,这么点时间要全面考察一个人难度很大 ...

  3. [bootstrap] bootstrap 简介和相关网址

    Bootstrap 来自 Twitter,是目前很受欢迎的前端框架. 基于 HTML.CSS.JAVASCRIPT ,简洁灵活,使 Web 开发更加快捷. Bootstrap提供了优雅的HTML和CS ...

  4. CentOS 6.x安装配置

    简述 VMware可以创建多个虚拟机,每个虚拟机上都可以安装各种类型的操作系统.安装方法也有很多种.下面,主要以ISO镜像安装为例,介绍CentOS 6.x的安装过程及相关的参数设置. 简述 创建虚拟 ...

  5. hdu----(5050)Divided Land(二进制求最大公约数)

    Divided Land Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  6. hdu-----(1113)Word Amalgamation(字符串排序)

    Word Amalgamation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. 创建生产订单函数BAPI_PRODORD_CREATE

    创建生产订单,创建订单长文本,订单下达 DATA:gs_bapi_pp_order_create TYPE bapi_pp_order_create. DATA:gt_bapi_order_key T ...

  8. WPF布局的6种面板

    WPF用于布局的面板主要有6个,StackPanel(栈面板).WrapPanel(环绕面板).DockPanel(停靠面板).Canvas(画布).Grid(网格面板)和 UniformGrid(均 ...

  9. [转]C#取得内网IP、外网IP、客户端IP方法

    前言 在 Windows Form Application 里对于取得 IP Address 有内网.外网两种 IP Address ,如果只需要取得内网 IP Address ,可以透过使用 IPH ...

  10. 编绎openssl杂记(window)

    Window 下 OpenSSL 编绎过程 1. 下载 ActivePerl-5.12.4.1205  , openssl-0.9.8 , 配置Perl环境变量 , 解压openssl-0.9.82. ...