前言

上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分。所以今天我们来仔细的研究一下这一部分。

sceneView::cull()函数核心部分

1、cullVisitor->pushStateSet函数:

A、_currentStateGraph = _currentStateGraph->find_or_insert(ss); 判断传入的渲染状态 ss 是否已经存在于这个状态节点中,如果存在则返回找到的那个ss,如果不存在新建一个包含了 ss 的状态节点。

B、创建渲染树,这个过程必须得满足三个条件。1)设置了渲染细节useRenderBinDetails()并且满足BinName不为空(只能为“RenderBin”或“DepthSortedBin”);2)渲染状态没有采用覆盖渲染细节(OVERRIDE_RENDERBIN_DETAILS)的方式(_numberOfEncloseOverrideRenderBinDetails==0);3)使用 setRenderBinDetails 设置了渲染细节,如果满足这三个条件将尝试转到指定的节点或者新建一个渲染元(RenderBin::find_or_insert 的工作),并使用堆栈记录上一次在渲染树中的位置。此外,渲染树的构建过程中只生成空的渲染元(RenderBin)节点,向其中纳入状态节点和渲染叶的任务将在后面的工作中完成。

2、向cullVisitor中设置MVP矩阵,然后通过cullVisitor->traverse(*_camera); (实际上就是调用CullVisitor::apply 函数函数(在遍历节点时调用))来负责根据不同的节点类型,在不同的时机调用cullVisitor->pushStateSet函数以及cullVisitor-> popStateSet函数。(下一节将会进行展开说明)

3、cullVisitor-> popStateSet函数:

A、_numberOfEncloseOverrideRenderBinDetails减一,然后还是上面介绍的cullVisitor->pushStateSet函数介绍的三种情况,判断是否使用了RenderBinDetails。然后还是从堆栈中取出上一次渲染树中所处的渲染元节点,并跳转到这一位置。

B、状态树从当前位置跳转到其父节点,即:

1
_currentStateGraph = _currentStateGraph->_parent;<br><br>

本节小结

通过简单的对cullVisitor->pushStateSet函数以及cullVisitor-> popStateSet函数的介绍,可以了解到在遍历场景节点树时,使用 pushStateSet 将某个节点的渲染状态置入,然后再将它的子节点的渲染状态置入,直到遍历完成。当结束这个子树的遍历时,则依次使用 popStateSet 弹出_currentRenderBin 和_currentStateGraph,直到返回初始位置为止。这么整个过程就是构建起渲染后台的状态树和渲染树。并且,假如在筛选(CULL)过程中我们判断某个节点(及其子树)应当被剔除掉时,只要跳过 pushStateSet 和 popStateSet的步骤,直接返回,就不会在进行渲染操作。这就是我们下一步要讨论的CullVisitor 的工作。

CullVisitor根本上就是NodeVisitor的子类,所以他的执行过程可以按照节点访问器(NodeVisitor)的工作原理来理解。

当我们执行节点的 accept(NodeVisitor* nv)函数时,当前节点自动调用 NodeVisitor::apply方法,将自身的信息传递给节点访问器 nv,由它负责执行相应的处理工作;然后节点将自动执行 Node::traverse 函数,调用所有子节点的 accept 函数,从而实现了节点树的遍历。在遍历的过程中每个节点都会调用 NodeVisitor::apply 将自身的指针传递给访问器,因此NodeVisitor 的每个派生类都会重载针对各个节点的 apply 函数,以实现针对不同类型节点的访问操作。

下一节我们就要对CullVisitor的 apply 重载函数进行探究。

原文链接 http://www.3wwang.cn/blog/article.ftl?id=52

探索未知种族之osg类生物---渲染遍历之裁剪二的更多相关文章

  1. 探索未知种族之osg类生物---渲染遍历之裁剪一

    前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...

  2. 探索未知种族之osg类生物---渲染遍历之裁剪三

    前言 在osgUtil::CullVisitor,我们发现apply函数的重载中,有CullVisitor::apply(Group& node),CullVisitor::apply(Swi ...

  3. 探索未知种族之osg类生物---渲染遍历之认识SceneView

    前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构,     a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息:     b  ...

  4. 探索未知种族之osg类生物---渲染遍历之器官协作

    好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...

  5. 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介

    我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...

  6. 探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations

    osg::GraphicsContext::runOperations().我们先来看一下这个函数的执行过程. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  7. 探索未知种族之osg类生物---渲染遍历之Renderer简介

    我们继续renderingTraversals()的探究.我们接着上一节的”阻塞渲染线程”后就要遍历所有摄像机的渲染器(Renderer),执行 Renderer::cull 场景筛选的操作.我们在r ...

  8. 《探索未知种族之osg类生物》目录

    精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...

  9. [转][osg]探索未知种族之osg类生物【目录】

    作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...

随机推荐

  1. wx.navigateBack(OBJECT)怎么携带参数呢?

    wx.navigateBack(OBJECT) 关闭当前页面,返回上一页面或多级页面.可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层. OBJECT 参数说明: 参数 ...

  2. Python科学计算结果的存储与读取

    Python科学计算结果的存储与读取 总结于2019年3月17日  荆楚理工学院 计算机工程学院 一.前言 显然,作为一名工科僧,执行科学计算,需用Python.PS:快忘记Matlab吧.我用了二十 ...

  3. 如何清除保存在IE浏览器上的账号密码

    1,打开浏览器,打开右上角的工具选项,选择Internet选项 2,在‘常规’选项卡中点击“删除”按钮,在弹框中勾选“密码”,选择删除即可.

  4. idea的环境设置

    IDEA的个人配置与常用操作 IDEA的个人配置 1.修改代码编辑器 新版的IDEA默认使用vim编辑器(linux下的一个工具),虽然熟练掌握后可以提高工作效率,但是学习成本很大,不习惯的可以选择关 ...

  5. LevelDB源码分析-Write

    Write LevelDB提供了write和put两个接口进行插入操作,但是put实际上是调用write实现的,所以我在这里只分析write函数: Status DBImpl::Write(const ...

  6. Spring再接触 Annotation part1

    使用annotation首先得加这两条代码 beans.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. 【第二组】Hunter-alpha版本发布报告

    Alpha版本测试报告 一  BUG汇总 1.暂时无法进行注册.(打算修复) 2.用户发布任务界面图标按钮存在显示bug.(打算修复) 3.主界面下拉菜单暂无内容,无法弹出.(打算修复) 二  场景测 ...

  8. 微信小程序 app.json文件配置

    https://developers.weixin.qq.com/miniprogram/dev/index.html  起步 https://developers.weixin.qq.com/min ...

  9. python入门(十六):正则

    1.正则:对一些字符串实现模糊的匹配 使用场景: 爬虫:例如,网页源码里面的url都提取出来.网页里面提取我们想要的数据 分析日志:例如,拿到所有的ip,看看哪些ip访问过我的网站 2.引入包 > ...

  10. 使用autohotkey修改方向键、回车和启动程序

    具体步骤 下载并安装autohotkey. 在你觉得合适的地方鼠标右键-新建-autohotkey script(脚本):或者创建一个别的文件,再把后缀改成ahk也可以 一个新建的ahk文档里面会有这 ...