参考:最长一帧

先介绍几个类:

osgUtil::CullVisitor:“筛选访问器”

当我们使用它遍历场景图形的各个节点时, CullVisitor 将会对每一个遇到的节点执行场景筛选的工作,判断它是否会超出视截锥体范围, 过于渺小,或者被遮挡节点(OccluderNode)挡住,从而将无助益于场景浏览的物体筛选并 剔除,降低场景绘制的资源消耗

osg::RenderInfo:“渲染信息”管理器

负责保存和管理与场景绘制息息相关的几 个重要数据:当前场景的视景器,当前场景对应的所有摄像机,以及当前所有 OpenGL 渲染 状态和顶点数据(使用第十七日所述的 osg::State 类保存)。这些数据将在场景筛选和渲染时 为 OSG 系统后台的工作提供重要依据。

osgUtil:: StateGraph:“状态节点”

我们可以对比场景树的组节点(Group),将 StateGraph 理解为 OSG 渲染后台的组节点。它的组织结构与场景图形的节点结构类似,但是状态树的 构建主要以节点的渲染状态集(StateSet)为依据:设置了 StateSet 的场景节点,其渲染状 态会被记录到“状态节点”中

osgUtil::RenderLeaf:“渲染叶”

理解为OSG渲染后台状态树的叶节点,是记录场景树中存在的各种Drawable对象

osgUtil::RenderStage:“渲染台”。

OSG 的渲染后台除了使用“状态树”来组织和优化节点的渲染状态之外,还有另外一种用于场景实际渲染的组织结构,我们称之为“渲染树”,“渲染树”的根节点就是“渲染台”

osgUtil::RenderBin:“渲染元”

OSG 渲染树的分支节点,不过对于没有特殊要求 的场景渲染来说,更多的渲染树分支也许并不需要:场景中需要渲染的元素及其渲染属性被 保存到各个“状态节点”和“渲染叶”当中;渲染树只要按照遍历的顺序,把这些数据记录 到作为根节点的“渲染台”当中就可以执行场景 的绘制工作了。

osgUtil::SceneView::cull 函数流程:

1、  初始化必要的 SceneView 类成员变量:

该视图的渲染信息(_renderInfo),

筛选访问器(_cullVisitor),

状态树根节点(_stateGraph)

渲染树根节点(_renderStage)。

此外还有局部渲染状态_localStateSet 的更新(SceneView::updateUniforms)

2、执行 SceneView::cullStage 函数,它也是场景视图筛选工作的核心函数。

3、执行 CullVisitor::clampProjectionMatrix,根据远/近平面的取值,重新设定场景视图 的投影矩阵。

核心函数SceneView::cullStage流程:

1、  首先统计场景中的遮挡节点(OccluderNode)

2、  将筛选所需的数据送入筛选访问器(CullVisitor),包括筛选设置(CullSettings),状 态树根节点(StateGraph),渲染树根节点(RenderStage),渲染信息(RenderInfo)。注意此 时状态树和渲染树还没有生成,我们还要设置渲染树构建所需的各种信息

3、  “全局状态节点”和“局部状态节点”追加到状态树中

4、  使用筛选访问器遍历场景中的节点,在遍历过程中将筛选出那些无法被用户看到的 对象,并将它们裁减掉,从而提高场景绘制的效率。

for(unsigned int childNo=0; childNo<_camera->getNumChildren(); ++childNo)

_camera->getChild(childNo)->accept(*cullVisitor);

5、  对筛选访问器执行之后得到的 渲染树内容进行排序和精简

6、  计算出场景中动态对象(DYNAMIC)的数目,并保存到 SceneView 的成员 变量_dynamicObjectCount 中,方便被 SceneView::getDynamicObjectCount 函数获取,并用于多线程模式下渲染 线程与场景更新的协调控制。

[原][OSG]深入osg函数----SceneView::cull 函数的更多相关文章

  1. [原][OSG]整理osg渲染一帧的流程

    参考:最长的一帧 先看下frame void ViewerBase::frame(double simulationTime) { advance(simulationTime);//记录仿真时间,帧 ...

  2. OSG显示文字——自定义显示文字函数

    #include <Windows.h> #include <osg/Geode> #include <osg/Geometry> #include <osg ...

  3. [原][osg][QT]osg与QT界面结合的简单例子二

    //main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...

  4. [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件

    参考: osgPlugins相关 osg读取文件的原理(插件工作机制) 当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现. 比如: osgviewer cow.o ...

  5. (原)torch中threads的addjob函数使用方法

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6549452.html 参考网址: https://github.com/torch/threads#e ...

  6. [OSG][转]osg格式文件

    转自:http://blog.csdn.net/timothyfly/article/details/7826139 osg格式文件中如何处理多个节点共享一个子节点 下面一段程序中,共有三个Group ...

  7. [osg][osgearth]osg的分页加载,代码和结构图

    DatabasePager加载数据的过程: 多线程 使用DatabasePager加载数据的流程: 左侧的图框表示数据的检索和输入, 中间的白色框表示用于数据存储的内存空间,而右边的图框表示存储数据的 ...

  8. [osg][原创]osg多屏幕显示,会出现透明需要设置的问题

    同事由于新加了一个屏幕,本来用 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->s ...

  9. 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

    '*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...

随机推荐

  1. 微信小程序- wx.request请求不到数据

    小程序官方文档手册 https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发问答社区 http://www.henkuai.com/forum.php wx.r ...

  2. PIMPL(二)

    文档下载 上一篇文档,PIMPL(一) 1 如何使用PIMPL 有多种方式实现PIMPL,这里按照<Effective C++>中介绍的方式. 1.1 基本步骤 假设原有Person如下: ...

  3. Math.abs(~2018) —— 入群问答题

    这道题的关键点在于对位操作符“~”的理解,以及内部的具体实现(设计到补码) 最后的结果是:2019 参考文章: http://www.w3school.com.cn/js/pro_js_operato ...

  4. liferay笑傲江湖-API之参数的工具类(ParamUtil)

    public class ParamUtil { 036 037 public static boolean get( 038 HttpServletRequest request, String p ...

  5. codeforces D - Arthur and Walls

    这题说的是给了一个矩阵,必须让.连接起来的图形变成矩形,2000*2000的矩形,那么我们就可以知道了,只要是存在一个有点的区域应该尽量将他削为矩形,那么将这个图形进行缩放,最后我们知道只要存在一个2 ...

  6. iOS 建立项目过滤机制 —— 给工程添加忽略文件.gitignore

        目前iOS 项目 主要忽略 临时文件.配置文件.或者生成文件等,在不同开发端这些文件会大有不同,如果 git add .把这些文件都push到远程, 就会造成不同开发端频繁改动和提交的问题. ...

  7. M2C的概念

    M2C即Manufacturers to Consumer(生产厂家对消费者),生产厂家(Manufacturers)直接对消费者(Consumers)提供自己生产的产品或服务的一种商业模式,特点是流 ...

  8. python isinstance用法

    isinstance(object,type) 其第一个参数(object)为对象,第二个参数(type)为类型名(int...)或类型名的一个列表((int,list,float)是一个列表). 其 ...

  9. Scrapy是什么

    1.Scrapy是蜘蛛爬虫框架,我们用蜘蛛来获取互联网上的各种信息,然后再对这些信息进行数据分析处理. 2.Scrapy的组成 引擎:处理整个系统的数据流处理,出发事务 调度器: 接受引擎发过来的请求 ...

  10. Linux基础命令---cat

    cat 连接文本文件或者标准输入,将结果输出到标准输出设备. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法       c ...