探索未知种族之osg类生物---渲染遍历之裁剪二
前言
上一节我们大致上过了一遍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类生物---渲染遍历之裁剪二的更多相关文章
- 探索未知种族之osg类生物---渲染遍历之裁剪一
前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...
- 探索未知种族之osg类生物---渲染遍历之裁剪三
前言 在osgUtil::CullVisitor,我们发现apply函数的重载中,有CullVisitor::apply(Group& node),CullVisitor::apply(Swi ...
- 探索未知种族之osg类生物---渲染遍历之认识SceneView
前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构, a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息: b ...
- 探索未知种族之osg类生物---渲染遍历之器官协作
好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...
- 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介
我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...
- 探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations
osg::GraphicsContext::runOperations().我们先来看一下这个函数的执行过程. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 探索未知种族之osg类生物---渲染遍历之Renderer简介
我们继续renderingTraversals()的探究.我们接着上一节的”阻塞渲染线程”后就要遍历所有摄像机的渲染器(Renderer),执行 Renderer::cull 场景筛选的操作.我们在r ...
- 《探索未知种族之osg类生物》目录
精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...
- [转][osg]探索未知种族之osg类生物【目录】
作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...
随机推荐
- php中上传图片,原生代码
一.实现图片上传方法一 html的写法: <form action="handle.php" name="form" method="post& ...
- spring boot aop 自定义注解 实现 日志检验 权限过滤
核心代码: package com.tran.demo.aspect; import java.lang.reflect.Method; import java.time.LocalDateTime; ...
- LeetCode 141. Linked List Cycle 判断链表是否有环 C++/Java
Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...
- 嵌入式文件IO实验
实验步骤: 1.arm-linux-gcc 交叉编译环境的安装.参考网站:https://jingyan.baidu.com/article/9c69d48f80282013c9024e20.html ...
- ActiveMq Windows 配置优化
最近ActiveMQ 5.15.3 会报 OutofMemory的错误 在 wrapper.conf中 #wrapper.java.additional.8=-Dorg.apache.activemq ...
- Maven打包后的文件存在中文乱码
发现打包的js文件虽然是UTF-8格式的编码,但是有中文有乱码 可设置jvm的编码,两种方法: 在系统的环境变量中添加一个变量,名为: JAVA_TOOL_OPTIONS, 值为:-Dfile.enc ...
- mongodb安装使用简单命令
.window+x,A,管理员进入cmd.cd C:\Program Files\MongoDB\Server\3.4\bin.安装:mongod --dbpath "D:\work\DB\ ...
- C#中将ListView数据导出为excel(转载)
首先引用excel库,下面我把代码贴出来. /// <summary> /// 将ListView的内容写入Excel表中 ...
- 宝塔面板安装在根目录www下
不能重装,重装防火墙要重新关闭. 安装时要主要更改文件权限.
- sqlserver 收缩数据库/文件
/******************************/ 1.右键-属性-选项-简单模式 2.右键-任务-收缩-文件 3.右键-任务-收缩-数据库 /********************* ...