zoukankan      html  css  js  c++  java
  • 探索未知种族之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

  • 相关阅读:
    使用WCF 测试客户端测试你的WCF服务
    使用Fiddler解析WCF RIA Service传输的数据
    SqlServer中BULK INSERT用法简介
    Silverlight的安全性初探
    使用Apache cxf 和Spring在Tomcat下发布Webservice指南
    Spring 3 MVC And XML Example
    设计与开发 JAXWS 2.0 Web 服务
    如何高效、准确、自动识别网页编码
    Spring 3 MVC And RSS Feed Example
    Spring 3 MVC And JSON Example
  • 原文地址:https://www.cnblogs.com/wang985850293/p/10510333.html
Copyright © 2011-2022 走看看