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

我们继续renderingTraversals()的探究。我们接着上一节的”阻塞渲染线程”后就要遍历所有摄像机的渲染器(Renderer),执行 Renderer::cull 场景筛选的操作。我们在renderingTraversals()中总是遇到这个Renderer类,我们就先补充一下他的介绍。

osgViewer::Renderer类为摄像机渲染场景的工作提供了一个公有接口。通常是在View::setCamera(osg::Camera* camera)函数中进行默认绑定的。


voidView::setCamera(osg::Camera* camera)

{

    if(_camera.valid()) _camera->setView(0);


    _camera = camera;


    if(_camera.valid())

    {

        _camera->setView(this);

        _camera->setRenderer(createRenderer(camera));

    }

}


osg::GraphicsOperation* View::createRenderer(osg::Camera* camera)

{

 Renderer* render = newRenderer(camera);

 camera->setStats(newosg::Stats("Camera"));

 returnrender;

}

我们既然找到了设置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简介)