我们继续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. Guava 6:Concurrency

    一.引子 有点经验的工程师一定对多线程比较熟悉,JDK封装的FutureTask实现了这一功能.如下图: FutureTask实现了RunnableFuture接口,而RunnableFuture接口 ...

  2. 通过zipfile解压指定目录下的zip文件

    代码: # -*- coding: utf-8 -*- import os import zipfile import platform import multiprocessing # 解压后的文件 ...

  3. denyhosts、中文文档乱码、端口占用查询

    1.安装 denyhosts, 设置 hosts.allow ,系统自动将攻击的ip 添加如 hosts.deny2.打开中文文档乱码, 将文档下载到windows, 通过富文本编辑器查看文档编码3. ...

  4. SpringMVC - 运行流程图及原理分析

    流程示意图: 代码分析图:

  5. 面试回顾——session相关

    原地址:https://blog.csdn.net/quiet_girl/article/details/50580095 Session结束生命周期的几种情况: (1)客户端关闭浏览器(只针对ses ...

  6. poi横纵动态导入

    dao层 <insert id ="saveInTarget" parameterType="java.util.List" > INSERT IN ...

  7. css:清楚html所有标签自带属性

    相信如果您动手写过网页的话,应该体会到有些标签会自带一些默认的样式,而这些样式或许又是我们不想要的,所以我们可以用以下代码清除所有标签的默认样式   html, body, div, span, ap ...

  8. 电商项目中使用Redis实现秒杀功能

    参与过抢购活动就知道,很明显的一点是商即便商品实际没有了也是可以下单成功的,但是在支付的时候会提示你商品没有了. 实现原理:list双向链表 使用redis队列,因为pop操作是原子的,即使有很多用户 ...

  9. Sql Server数据库之事务,视图,索引

    一.事务的定义 事务是一种机制,包含一组操作指令,并将所有的命令作为一个整体一起向系统提交或撤销操作请求(要么都执行,要么都不执行) 二.事务的分类 显式事务:用Begin TRANSCATION开始 ...

  10. springmvc shiro UnauthorizedException 异常解决方案

    springMVC 整合 shiro 时,配置了当访问某个URL没有权限时的配置处理: <!-- 通过unauthorizedUrl指定没有权限操作时跳转页面 --><propert ...