osg::GraphicsContext::runOperations()。我们先来看一下这个函数的执行过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void GraphicsContext::runOperations()
{
    // sort the cameras into order
    typedef std::vector<Camera*> CameraVector;
    CameraVector camerasCopy;
    std::copy(_cameras.begin(), _cameras.end(), std::back_inserter(camerasCopy));
    std::sort(camerasCopy.begin(), camerasCopy.end(), CameraRenderOrderSortOp());
 
    for(CameraVector::iterator itr = camerasCopy.begin();
        itr != camerasCopy.end();
        ++itr)
    {
        osg::Camera* camera = *itr;
        if (camera->getRenderer()) (*(camera->getRenderer()))(this);
    }
 
    for(GraphicsOperationQueue::iterator itr = _operations.begin();
        itr != _operations.end();
        )
    {
        {
            OpenThreads::ScopedLock lock(_operationsMutex);
            _currentOperation = *itr;
 
            if (!_currentOperation->getKeep())
            {
                itr = _operations.erase(itr);
 
                if (_operations.empty())
                {
                    _operationsBlock->set(false);
                }
            }
            else
            {
                ++itr;
            }
        }
 
        if (_currentOperation.valid())
        {
            // OSG_INFO<<"Doing op "<getName()<<" "<<this<<std::endl;
 
            // call the graphics operation.
            (*_currentOperation)(this);
 
            {
                OpenThreads::ScopedLock lock(_operationsMutex);
                _currentOperation = 0;
            }
        }
    }
}
      • 1、获取场景中所有注册的摄像机(包括主摄像机和从摄像机组),对它们执行排序,排序的原则根据摄像机的渲染顺序而定,可以通过 Camera::setRenderOrder 进行设置。设置为PRE_RENDER 级别的摄像机排序在最前,而 POST_RENDER 级别的摄像机排序在最后;同一级别的摄像机根据 setRenderOrder 函数中传入的整数设置先后顺序,排序数较小的摄像机在前。
      • 2、依次遍历排序过的各个摄像机,执行其渲染器 Renderer 的 operator()操作,它有一个传入参数,即当前的 GraphicsContext 图形设备。这个重载的操作符实质上执行了场景在该图形设备中的绘制工作,因此前面的排序工作将决定哪个摄像机的内容先被绘制出来。Renderer 类成员函数 operator()的工作仅仅是判断是否使用图形线程来执行场景的筛选(根据 Renderer::_graphicsThreadDoesCull 变量的值)。
      • 3、遍历 GraphicsContext::_operations 队列中的各个 Operation 对象,判断operation对象是否会在后续的应用操作中进行使用,如果没有指定其在后续的应用操作中进行使用则在执行其 operator()操作后从_operations 队列中清空。这里的 osg::Operation 类就是我们上一章讲到的osg::Renderer类,osg::Renderer继承自osg::GraphicsOperation,所以这里就是执行osg::Renderer的operator()操作,如果还定义了其他的继承自osg::GraphicsOperation的类,那么他的operator()操作也是在这里被调用的。
      • 4、我们到void Renderer::operator () (osg::GraphicsContext* /*context*/)函数下看看这里到底进行了什么操作。(根据 Renderer::_graphicsThreadDoesCull 变量的值)来区分,对于单线程模型(SingleThreaded)来说,它将转向到 Renderer::draw 函数,因为场景筛选的工作已经由前面的代码完成了;对于线程模型(CullDrawThreadPerContext)来说,它将转向 Renderer::cull_draw 函数;而对于另外两种线程模型而言,DrawThreadPerContext 同样使用 Renderer::cull 和 Renderer::draw 来执行场景筛选与绘制的工作,而 CullThreadPerCameraDrawThreadPerContext 则为每个摄像机创建线程来完成筛选工作,场景的绘制仍然由下文将要叙述的 Renderer::draw 来完成。

总结一下osg::GraphicsContext::runOperations(),其实就是一个在调用osg::Operation 类的operation()之前进行的一次筛选工作。下一步我们就是来介绍一下Renderer::draw()进行了什么样的操作。

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

探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations的更多相关文章

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

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

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

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

  3. 探索未知种族之osg类生物---渲染遍历之Renderer简介

    我们继续renderingTraversals()的探究.我们接着上一节的”阻塞渲染线程”后就要遍历所有摄像机的渲染器(Renderer),执行 Renderer::cull 场景筛选的操作.我们在r ...

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

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

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

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

  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. HBase各版本对Hadoop版本的支持情况

    转载自:http://blog.csdn.net/sunny05296/article/details/54089194 安装HBase时,要考虑选择正确的Hadoop版本,否则可能出现不兼容的情况. ...

  2. TCP/IP学习20180701-数据链路层-IP子网寻址

    IP-子网寻址IP地址是:网络号+主机号现在主机号都要求有子网号所以IP地址就变成了网络号+子网号+主机号例如一个B类地址:210.30.109.134210.30是网络号109是子网号134是主机号 ...

  3. Python中print字体颜色的设置

    Python中print字体颜色的设置 实现过程:       终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.       转义序列是以ESC开头,即用\033来完成 ...

  4. redis持久化 (rdb

    RDB(快照持久化) RDB(redis database),可以理解为快照/内存快照,RDB持久化过程是将当前进程中的数据生成快照存储到硬盘中 触发机制RDB持久化的触发机制分为两种,手动触发和自动 ...

  5. 性能测试day07_性能瓶颈和分析

    其实如果之前都做的很到位的话,那么再加上APM工具(dynaTrace等),监控到非常细节,那么我们跑一个业务,我们就能完全清楚的知道每个请求的时间,也能知道请求所产生sql的时间,这样你自然而然都知 ...

  6. gradle-4.1-all.zip离线包下载 极速 android studio2.3 3.0编译必备

    http://download.csdn.net/download/yongheng289/10039982 gradle-4.1-all.zip离线包下载 极速 android studio2.3 ...

  7. spring boot 之 spring security 配置

    Spring Security简介 之前项目都是用shiro,但是时过境迁,spring security变得越来越流行.spring security的前身是Acegi, acegi 我也玩过,那都 ...

  8. python 爬虫启航

    1. 使用excel(简单使用) 数据- 自网站-导入 2.you-get python爬虫入门 1.环境配置 python,request,lxml 2.原理 爬虫的框架如下: 1.挑选种子URL: ...

  9. Mac 笔记本 开发日记

    1.录屏,截图 Mac 自带录屏功能 command +control +o 2.复制当前应用,在启一个当前app窗口 command+n 3.快速回到桌面 command +f3 4.选中文件,复制 ...

  10. ubuntu16下用QT5实现对话框应用

    ubuntu16下用QT5,实现对话框程序,步骤:生成界面Dialog.ui,将它应用到主程序,通过主程序显示. 一 界面练习 1 Dialog.ui界面生成 在命令行输入:designer 进入界面 ...