前言

上一节我们大致上过了一遍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. python爬虫爬取京东、淘宝、苏宁上华为P20购买评论

    爬虫爬取京东.淘宝.苏宁上华为P20购买评论 1.使用软件 Anaconda3 2.代码截图 三个网站代码大同小异,因此只展示一个 3.结果(部分) 京东 淘宝 苏宁 4.分析 这三个网站上的评论数据 ...

  2. AND 初识

    框架

  3. QT与opencv(二)开启摄像头

    OpenCV中的VideoCapture不仅可以打开视频.usb摄像头,还可以做很多事,例如读取流媒体文件,网络摄像头,图像序列等. 下面我简单介绍一个在Qt中用VideoCapture类打开笔记本电 ...

  4. (8/24) 图片跳坑大战--css中的图片处理

    前言:此节的开展是在上一节的基础上进行的,(每一节都是从无到有编写关于此节的知识),最后会附上相关完整代码.上一节 CSS中的图片处理 1.新建images文件夹 在src目录下新建一个images文 ...

  5. 在IDEA中设置命令行参数

  6. django之关联field 描述子

    """Accessors for related objects. When a field defines a relation between two models, ...

  7. BitmapData.threshold()方法

    import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Rectangle; import fl ...

  8. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

  9. [GNU] 喝一杯咖啡, 写一写 Makefile

    Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...

  10. 跑步“无核心,不PB”

    核心力量不管是在跑步中,还是在生活中都有着重要的作用,核心能让你的身体机能更加强劲. 1.什么是核心肌群? 核心肌群就是指我们所说的躯干,包括脊柱.骨盆.及周围肌群. 核心肌群由腹直肌.腹横肌.腹斜肌 ...