[原][OSG]深入osg函数----SceneView::cull 函数
参考:最长一帧
先介绍几个类:
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 函数的更多相关文章
- [原][OSG]整理osg渲染一帧的流程
参考:最长的一帧 先看下frame void ViewerBase::frame(double simulationTime) { advance(simulationTime);//记录仿真时间,帧 ...
- OSG显示文字——自定义显示文字函数
#include <Windows.h> #include <osg/Geode> #include <osg/Geometry> #include <osg ...
- [原][osg][QT]osg与QT界面结合的简单例子二
//main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...
- [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件
参考: osgPlugins相关 osg读取文件的原理(插件工作机制) 当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现. 比如: osgviewer cow.o ...
- (原)torch中threads的addjob函数使用方法
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6549452.html 参考网址: https://github.com/torch/threads#e ...
- [OSG][转]osg格式文件
转自:http://blog.csdn.net/timothyfly/article/details/7826139 osg格式文件中如何处理多个节点共享一个子节点 下面一段程序中,共有三个Group ...
- [osg][osgearth]osg的分页加载,代码和结构图
DatabasePager加载数据的过程: 多线程 使用DatabasePager加载数据的流程: 左侧的图框表示数据的检索和输入, 中间的白色框表示用于数据存储的内存空间,而右边的图框表示存储数据的 ...
- [osg][原创]osg多屏幕显示,会出现透明需要设置的问题
同事由于新加了一个屏幕,本来用 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->s ...
- 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解
'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...
随机推荐
- Python基础socket编程
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- VUE路由去除#问题
最近自己在写一个vue的小型管理系统,在浏览器中看到的路由都是带有#的,很是不好看.为了解决此问题,大家一般都会想到:mode: 'history'.可是在开发阶段没有问题,但是一旦build打包后, ...
- cygwin本地.bashrc配置
echo -e "====================================================================================== ...
- Object-C-系统类型对象归档
系统类型主要是指NSString NSDictionary,NSArray,NSData,NSNumber 类型数据(包括对应可变类型); 这些类型已经实现了NSCoding协议,支持归档, 写入方法 ...
- HTTP 超文本协议
转载 :http://mp.weixin.qq.com/s/3d3zhksViX2NTuIssiYGJg
- 启动Tomcat服务时,出现org.apache.catalina.startup.VersionLoggerListener报错
启动Tomcat服务时,出现org.apache.catalina.startup.VersionLoggerListener报错解决办法:打开Tomcat安装后目录,进入conf文件夹,找到配置文件 ...
- python之路----面向对象的封装特性
封装 [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种只让自己的对象能调用自己类中的方法 狭义上的封装 —— 面向对象的三大 ...
- bzoj1658: [Usaco2006 Mar]Water Slides 滑水
Description It's a hot summer day, and Farmer John is letting Betsy go to the water park where she i ...
- centos 安装 ffmpeg
使用yum方式安装ffmpeg: 先安装Nux Dextop仓库: Nux Dextop库依赖于EPEL库,所有要先安装EPEL库(需要管理员权限). 如果安装过则跳过. $ su root $ yu ...
- map按value值查找——find_if的使用(转载)
转载:http://www.cnblogs.com/xufeiyang/archive/2012/05/09/2491871.html CValueFind #ifndef _CVALUEFIND_H ...