[原][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函数 和 ...
随机推荐
- APPIUM Android 定位方式
原文地址https://www.cnblogs.com/sundalian/p/5629500.html 1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouc ...
- ngxin开启rewrite伪静态
1.编辑nginx配置文件 vi /usr/local/nginx/conf/nginx.conf #include enable-php.conf; include enable-php-pathi ...
- Java设计模式应用——工厂模式
工厂模式有三种:简单工厂.工厂方法.抽象工厂 一. 抽象工厂 1. 一个可以生产多种产品的工厂: 2. 不改变工厂无法生产新的产品. package com.coshaho.learn.factory ...
- node.js cookie session使用教程
众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢? cookie 首先产生了 cookie 这门技术来 ...
- 深入理解kafka
摘自: <kafka权威指南> 集群间成员关系 Kafka 使用Zoo keeper 来维护集群成员的信息.每个broker 都有一个唯一标识符,这个标识符可以在配置文件里指定,也可以自动 ...
- Web安全学习笔记之DES算法实例详解
转自http://www.hankcs.com/security/des-algorithm-illustrated.html 译自J. Orlin Grabbe的名作<DES Algorith ...
- Sybase 删除表的某列
Sybase 删除表的某列 Sybase 删除表的某列sql: --想删除字段temp1(该字段的所有值已置为null) alter table nh_bill_detail drop temp1;
- Python3 获取网络图片并且保存到本地
Python3 获取网络图片并且保存到本地 import requests from bs4 import BeautifulSoup from urllib import request impor ...
- 20145101《JAVA程序设计》课程总结
每周读书笔记链接汇总 假期笔记 第1周学习总结 第2周学习总结 第3周学习总结 第4周学习总结 第5周学习总结 第6周学习总结 第7周学习总结 第8周学习总结 第9周学习总结 第10周学习总结 实验报 ...
- 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...