探索未知种族之osg类生物---渲染遍历之Renderer简介
我们继续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简介的更多相关文章
- 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介
我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...
- 探索未知种族之osg类生物---渲染遍历之认识SceneView
前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构, a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息: b ...
- 探索未知种族之osg类生物---渲染遍历之器官协作
好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...
- 探索未知种族之osg类生物---渲染遍历之裁剪一
前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...
- 探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations
osg::GraphicsContext::runOperations().我们先来看一下这个函数的执行过程. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 探索未知种族之osg类生物---渲染遍历之裁剪三
前言 在osgUtil::CullVisitor,我们发现apply函数的重载中,有CullVisitor::apply(Group& node),CullVisitor::apply(Swi ...
- 探索未知种族之osg类生物---渲染遍历之裁剪二
前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...
- 《探索未知种族之osg类生物》目录
精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...
- [转][osg]探索未知种族之osg类生物【目录】
作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...
随机推荐
- unity的一些tips
主要是我知乎上回答的一个关于unity的tip,备忘. 说说我所看到unity相关的,不好的习惯: 1 尽量不要在Awake(), start()等函数内加入业务逻辑的初始化代码.首先无法简便的直接启 ...
- pycharm同步代码
有时候我们需要在windows环境开发代码,但是程序要跑在linux服务器或者我们的linux虚拟机上,这就设计到了代码同步的问题. pycharm提供了代码同步的功能. 在导航栏点击Tools--D ...
- 【算法和数据结构】_14_小算法_Blank字符替换
/* 本程序用来将输入的制表符替换为\t, 而将退格替换为\b, 将反斜杠替换为\\ */ #include <stdio.h> #include <stdlib.h> typ ...
- Ubuntu 14.10 下安装Ambari
安装ambari有两种方式,一是自己下载源码编译,另外一个是使用公共仓库 1 使用Public Respositories Step1: Download the Ambari repository ...
- 20165312 2017-2018-2《Java程序设计》第9周学习总结
20165312 2017-2018-2<Java程序设计>第9周学习总结 上周错题总结 1.进程的基本状态有:新建.运行.阻塞.死亡. A . true B . false 解析:A 这 ...
- 未预期的符号 `$'{\r'' 附近有语法错误
../runcmake: 行 2: $'\r': 未找到命令 ../runcmake: 行 3: 未预期的符号 `$'{\r'' 附近有语法错误 考虑到代码是从windows下一直过来的,脚本可能在格 ...
- CentOS7 JDK1.8部署详解
一.下载 首先需要将本地下载好的jdk包拷贝到Linux中:scp jdk-8u91-linux-x64.tar.gz hadoop@192.168.***.***:~/software/ //星号处 ...
- 高校手机签到系统——第一部分Authority权限系统(上)
序:今天开始写一个算是我第一个系列的文章——高校手机签到系统.本系统结合我们学校自身的一些特点编写.这是我的毕业设计项目,写在这里算是给最后论文的时候一些点滴的记录.另外也想通过这个系列的文章找到一份 ...
- jQuery.ajax()调用asp.net后台方法(非常重要)
http://www.cnblogs.com/zxhoo/archive/2011/01/30/1947752.html 用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先 ...
- <记录> PHP读取命令行参数
方法一:使用$argv or $argc参数接收 echo "接收到{$argc}个参数"; print_r($argv); [root@DELL113 lee]# /usr/lo ...