首页 技术 正文
技术 2022年11月18日
0 收藏 835 点赞 3,058 浏览 2840 个字

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

?

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,078
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,553
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,402
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,177
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,814
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898