我们继续renderingTraversals()的探究。我们接着上一节的”阻塞渲染线程”后就要遍历所有摄像机的渲染器(Renderer),执行 Renderer::cull 场景筛选的操作。我们在renderingTraversals()中总是遇到这个Renderer类,我们就先补充一下他的介绍。

osgViewer::Renderer类为摄像机渲染场景的工作提供了一个公有接口。通常是在View::setCamera(osg::Camera* camera)函数中进行默认绑定的。

1
2
3
4
5
6
7
8
9
10
11
12
void View::setCamera(osg::Camera* camera)
{
    if (_camera.valid()) _camera->setView(0);
 
    _camera = camera;
 
    if (_camera.valid())
    {
        _camera->setView(this);
        _camera->setRenderer(createRenderer(camera));
    }
}<br><br>
1
2
3
4
5
6
osg::GraphicsOperation* View::createRenderer(osg::Camera* camera)
{
 Renderer* render = new Renderer(camera);
 camera->setStats(new osg::Stats("Camera"));
 return render;
}

我们既然找到了设置Renderer的时机,那么我们来进入Renderer类,先看看他的初始化做了些什么事情。

我们先要介绍一下这里遇到的新的osg内部变量:场景视图,也就是 osgUtil::SceneView 类,在 OSG 早期版本中这个类时常需要由用户调用来完成各类功能;但是这个类已经不建议使用了,现在仅仅由 OSG 系统内部加以调用,也就是这个渲染器(Renderer)负责调用场景视图(SceneView)各种功能。每个渲染器当中都会自动创建两个 SceneView 对象(Renderer::_sceneView[2]),从而实现了渲染后台双缓存的支持。再往下就是得到camera中的viewer,显示设置(ds),光照信息,以及(自增式合并渲染操作)osgUtil::IncrementalCompileOperation等分别设置到两个 SceneView 对象(Renderer::_sceneView[2])中。已经对两个 SceneView 对象设定远近裁剪遍历。

我们介绍完了Renderer类的初始化,就可以开始对Renderer::cull函数的探究了。

1、首先从_availableQueue 队列中获取一个可用的场景视图(SceneView)。这个队列中通常会保存有两个 SceneView 对象,以实现我们刚刚提到的渲染后台双缓存支持。

2、执行 Renderer::updateSceneView 函数,更新这个场景视图的全局渲染状态(根据场景主摄像机的 StateSet 渲染状态集,更新成员变量 SceneView::_globalStateSet),状态量(osg::State),显示设置(osg::DisplaySettings)。

3、更新场景视图(SceneView)的融合距离(Fusion Distance)。所谓融合距离,指得是双眼所在平面到视线汇聚点的距离,可以通过 View::setFusionDistance函数传递给 SceneView,通常应用于立体显示的场合。

4、就是从state中得到FramStep的对象,然后就可以记录这一次cull裁剪的开始时间和所在的帧数。以及更新筛选设置(CullSettings)。

5、开始cull操作。

6、记录场景筛选所耗费的时间,并保存到统计器(osg::Stats)中。

7、最后,将这个渲染视图添加到绘制队列_drawQueue 中。这个队列中保存的对象将在场景绘制时用到。

具体cull裁剪的操作介绍,我们得先对SceneView 的深入学习。根据指导书籍最长一帧的介绍,我们先对void ViewerBase::renderingTraversals()的下一个步骤,遍历所有的GraphicsContext,然后执行GraphicsContext::runOperations函数。所以下一节我们先研究一下GraphicsContext::runOperations函数。

原文链接 http://www.3wwang.cn/blog/article.ftl?id=39

探索未知种族之osg类生物---渲染遍历之Renderer简介的更多相关文章

  1. 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介

    我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...

  2. 探索未知种族之osg类生物---渲染遍历之认识SceneView

    前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构,     a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息:     b  ...

  3. 探索未知种族之osg类生物---渲染遍历之器官协作

    好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...

  4. 探索未知种族之osg类生物---渲染遍历之裁剪一

    前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...

  5. 探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations

    osg::GraphicsContext::runOperations().我们先来看一下这个函数的执行过程. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  6. 探索未知种族之osg类生物---渲染遍历之裁剪三

    前言 在osgUtil::CullVisitor,我们发现apply函数的重载中,有CullVisitor::apply(Group& node),CullVisitor::apply(Swi ...

  7. 探索未知种族之osg类生物---渲染遍历之裁剪二

    前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...

  8. 《探索未知种族之osg类生物》目录

    精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...

  9. [转][osg]探索未知种族之osg类生物【目录】

    作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...

随机推荐

  1. bzoj5048: 塌陷的牧场

    Description 农夫小Q将他的奶牛们饲养在一个长n宽m的矩形网格牧场中.行从上到下依次编号为1到n,列从左往右依次编号为1 到m.为了防止奶牛们逃跑,小Q在牧场外圈安装了一排电网,只要奶牛走出 ...

  2. 饥饿的牛(dp一维最大覆盖)

    问题 H: 饥饿的牛 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 12[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目 ...

  3. Kettle从excel导入数据到sql server

    从excel工作表中读取数据逐行执行insert语句插入到sqlserver 为了简单起见只选取了三个个字段作为参数,日期,字符类型的需要加上'' Spoon是作业配置的GUI界面,配置好后可以通过控 ...

  4. 支付宝 net

  5. CSS笔试题

    如何实现移动端9宫格 如何实现移动端下列8宫格 实现移动端图片画廊CSS样式 写一个简单的animation的css动画 美化select,radio,range样式,只需考虑谷歌浏览器,下面给出的是 ...

  6. [UnityAPI]SerializedObject类 & SerializedProperty类

    以Image类为例 1.MyImage.cs using UnityEngine; using UnityEngine.UI; public class MyImage : Image { ; pro ...

  7. 表单:!!!常用JS: form 表单代码

    手机(文本框): <input type="text" name="" maxlength="11" placeholder=&quo ...

  8. (14)其他Linux命令

    *****拷贝文件cp somefile.1 /home/hadoop/      以原文件名进行拷贝 cp somefile.1 /home/hadoop/somefile.2    以新文件名进行 ...

  9. PHP响应码和HTTP请求方法

    HTTP请求报文由请求行(request line).请求头部(header).空行和请求数据4个部分组成,格式如下 可见请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格 ...

  10. Django01-Django基础

    一.什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统.对于所有的Web应用,本质上其实就是一个socket服 ...