前言

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

osg::Util::SceneView::cull()

好,相信大家已经又复习了上面几节的内容,那我们就进行sceneView的第一个重要功能osg::Util::SceneView::cull()函数。场景的筛选函数 cull 主要完成了以下几个工作。

1、通过_camera->getNodeMask()==0来判断主相机下的根节点是否可见,如果不可见则不用进行cull操作。

2、进行视图的渲染信息(_renderInfo)的初始化

3、通过updateUniforms();更新一些osg内设的 osg::Uniform 着色器变量(osg_FrameNumber,osg_FrameTime等)。因为opengl中Uniform表示这个变量可以被所有的shader访问到,所以我们在编写 GLSL 程序时调用这些变量获取 OSG 提供的一些场景和时间方面的信息。

4、对筛选访问器(_cullVisitor),状态树根节点(_stateGraph)和渲染树根节点(_renderStage)进行初始化操作。

5、通过_displaySettings->getStereo()来判断是否进行立体渲染(例如VR等),那么此时 OSG 会针对左/右眼(osg::DisplaySettings::LEFT_EYE/RIGHT_EYE)以其它各种设置做出适当的处理,相关的函数包括 SceneView 类成员 computeLeftEyeProjection,computeLeftEyeView,computeRightEyeProjection,computeRightEyeView 等。这些就等我们研究到osg与vr(ar)结合的时候我们再仔细的研究

6、(不是立体渲染)进行普通渲染,通过cullStage进行cull操作。我们进入SceneView::cullStage内。

A、首先判断camera中是否存在遮挡节点(OccluderNodes)如果存在,就会通过_collectOccludersVisitor->traverse(*_camera),根据投影矩阵(projection)、视图模型矩阵(modelview)以及视口矩阵(modelview)来对场景图进行遍历,找到发生遮挡的位置(也就是得到被遮挡的节点)。将筛选所需的数据送入筛选访问器(CullVisitor),包括筛选设置(CullSettings),状态树根节点(StateGraph),渲染树根节点(RenderStage),渲染信息(RenderInfo)

B、设置状态树以及渲染树构建所需的各种信息。例如viewport、ClearColor、ClearDepth、ClearAccum、ClearStencil、ClearMask、camera等,还要对全局状态节点以及局部状态节点进行默认设置(上一节说到过)。

C、如果camera中设置了CullCallback回调函数,那么就要对摄像机下的所有节点都要进行遍历,并且执行回调函数。如果没有则使用筛选访问器cullVisitor遍历场景中的节点,在遍历过程中将筛选出那些无法被用户看到的对象(被遮挡的,以及超出视椎体的),并将它们裁减掉,从而提高场景绘制的效率。

7、进行完了cull操作后。先后“弹出”模型视点矩阵(所用函数为popModelViewMatrix,事实上只是弹出堆栈中的临时数据,计算结果仍然保留,下同)、投影矩阵、视口矩阵,渲染状态(使用 popStateSet))

8、依次对筛选访问器执行之后得到的渲染树内容进行排序RenderStage::sort和精简StateGraph::prune(构建过程中可能有些空节点需要剔除)

9、最后,计算出场景中动态对象(DYNAMIC)的数目,并保存到 SceneView 的成员变量_dynamicObjectCount 中

10、返回结果computeNearFar。

接下来我们将要深入osgUtil:: CullVisitor类,进一步研究裁剪操作。

探索未知种族之osg类生物---渲染遍历之裁剪一的更多相关文章

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

    前言 在osgUtil::CullVisitor,我们发现apply函数的重载中,有CullVisitor::apply(Group& node),CullVisitor::apply(Swi ...

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

    前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...

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

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

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

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

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

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

  6. 探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations

    osg::GraphicsContext::runOperations().我们先来看一下这个函数的执行过程. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

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

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

  8. 《探索未知种族之osg类生物》目录

    精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...

  9. [转][osg]探索未知种族之osg类生物【目录】

    作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...

随机推荐

  1. Bootstrap table方法,Bootstrap table事件,配置

    调用 BootStrap Table 方法的语法: $('#table').bootstrapTable('method', parameter); 例如: $('#my_table').bootst ...

  2. OSS RFC

    This is a very late reply, but just want to share the process of setting up all associated RFCs with ...

  3. python shutil模块&random模块

    shutil模块 import shutil shutil.copyfileobj(open("os_.py", "r"), open("os_2.p ...

  4. hadoop 二次排序的一些思考

    先说一下mr的二次排序需求: 假如文件有两列分别为name.score,需求是先按照name排序,name相同按照score排序 数据如下: jx 20 gj 30 jx 10 gj 15 输出结果要 ...

  5. 每日一练之贪心算法(P2587)

    洛谷——P2587 [ZJOI2008]泡泡堂 两队人马进行比赛, 战斗力值各有差异, 如果一方获胜得两分,战平各得一分,失败不得分,求可取得的最佳战绩与最差战绩. 思路:1)最强的打得过最强的就直接 ...

  6. 关于background-size 的一点小坑

    目前在做一个网页,要求使用一个图片作为背景,必须要全屏目填充,于是我想,这不是很简单的事情么: 有两种实现方法:首先设置添加一个div(或者body),把div(或者body)元素的宽和高都设置成10 ...

  7. HQL中左连接,右连接、内连接

    左连接:left join 如A left join B 即取出A表的所有数据,由on条件关联的B表数据,有则显示,没有则为空: 右连接:right join 如 A right join B 即取出 ...

  8. could not open input file 错误

    配置laravel时遇到的小错误 ps:php -S localhost:81 -t 框架目录/public S大写 端口不要被占用

  9. input 标签,不可更改

    1.disabled 属性规定应该禁用 input 元素,被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值.设置后文字的颜色会变成灰色.disabled 属 ...

  10. Java8内置的函数式编程接口应用场景和方式

    首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...