参考:最长一帧

先介绍几个类:

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. GreenPlum安装greenplum-cc-web监控

    一. GreenPlum集群安装环境 由虚拟机搭建的一台master两台segment. 二.安装前准备 1) 所需安装包 GreenPlum监控安装包: greenplum-cc-web-3.0.2 ...

  2. UVM中的regmodel建模(三)

    总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block ...

  3. 学号20155311 2016-2017-2 《Java程序设计》第9周学习总结

    学号 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 整合数据库 JDBC(Java DataBase Connectivity)即java数据库连接,是一种 ...

  4. CPU VS GPU(性能调优 12.1)

    CPU VS GPU 关于绘图和动画有两种处理的方式:CPU(中央处理器)和GPU(图形处理器).在现代iOS设备中,都有可以运行不同软件的可编程芯片,但是由于历史原因,我们可以说CPU所做的工作都在 ...

  5. fiddler——一款莱斯的抓包工具

    进行页面和接口调试时候,好使得抓包工具还是有作用得,如postman,fiddler,相比,postman更适合用来接口调试和与其他人一起联调,而抓包监控web得时候我更喜欢用fiddler: 当然, ...

  6. mysql count group by统计条数方法

    mysql count group by统计条数方法 mysql 分组之后如何统计记录条数? gourp by 之后的 count,把group by查询结果当成一个表再count一次select c ...

  7. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  8. 电脑异常断电,IDEA崩溃

    今天电脑突然断电,当时正好开着idea,等了半天无果,只能强行关机重启.重启之后,那么问题来了:重新打开idea报错java.lang.AssertionError:upexpected conten ...

  9. 出现“基础链接已关闭,无法链接到远程服务器"错误的解决办法

    一些用户在安装一些软件或是系统做某些修改后,采集器就没无登录或是无法获取到网页.登录或是使用httppostget工具会出现 ”基础链接已关闭,无法链接到远程服务器“的提示.经分析,是系统Socket ...

  10. MySQL笔记(六)游标练习

    23.3.1 Trigger Syntax and Examples 意义不明的几道练习,留着备用. 感觉不好写,而且难以调试..不知道以后会不会有实际的应用场景. 环境:MySQL 笔记(三)由 t ...