• [原][OSG]深入osg函数----SceneView::cull 函数


    参考:最长一帧

    先介绍几个类:

    osgUtil::CullVisitor:“筛选访问器”

    当我们使用它遍历场景图形的各个节点时, CullVisitor 将会对每一个遇到的节点执行场景筛选的工作,判断它是否会超出视截锥体范围, 过于渺小,或者被遮挡节点(OccluderNode)挡住,从而将无助益于场景浏览的物体筛选并 剔除,降低场景绘制的资源消耗

    osg::RenderInfo:“渲染信息”管理器

    负责保存和管理与场景绘制息息相关的几 个重要数据:当前场景的视景器,当前场景对应的所有摄像机,以及当前所有 OpenGL 渲染 状态和顶点数据(使用第十七日所述的 osg::State 类保存)。这些数据将在场景筛选和渲染时 为 OSG 系统后台的工作提供重要依据。

    osgUtil:: StateGraph:“状态节点”

    我们可以对比场景树的组节点(Group),将 StateGraph 理解为 OSG 渲染后台的组节点。它的组织结构与场景图形的节点结构类似,但是状态树的 构建主要以节点的渲染状态集(StateSet)为依据:设置了 StateSet 的场景节点,其渲染状 态会被记录到“状态节点”中

    osgUtil::RenderLeaf:“渲染叶”

    理解为OSG渲染后台状态树的叶节点,是记录场景树中存在的各种Drawable对象

    osgUtil::RenderStage:“渲染台”。

    OSG 的渲染后台除了使用“状态树”来组织和优化节点的渲染状态之外,还有另外一种用于场景实际渲染的组织结构,我们称之为“渲染树”,“渲染树”的根节点就是“渲染台”

    osgUtil::RenderBin:“渲染元”

    OSG 渲染树的分支节点,不过对于没有特殊要求 的场景渲染来说,更多的渲染树分支也许并不需要:场景中需要渲染的元素及其渲染属性被 保存到各个“状态节点”和“渲染叶”当中;渲染树只要按照遍历的顺序,把这些数据记录 到作为根节点的“渲染台”当中就可以执行场景 的绘制工作了。

    osgUtil::SceneView::cull 函数流程:

    1、  初始化必要的 SceneView 类成员变量:

    该视图的渲染信息(_renderInfo),

    筛选访问器(_cullVisitor),

    状态树根节点(_stateGraph)

    渲染树根节点(_renderStage)。

    此外还有局部渲染状态_localStateSet 的更新(SceneView::updateUniforms)

    2、执行 SceneView::cullStage 函数,它也是场景视图筛选工作的核心函数。

    3、执行 CullVisitor::clampProjectionMatrix,根据远/近平面的取值,重新设定场景视图 的投影矩阵。

    核心函数SceneView::cullStage流程:

    1、  首先统计场景中的遮挡节点(OccluderNode)

    2、  将筛选所需的数据送入筛选访问器(CullVisitor),包括筛选设置(CullSettings),状 态树根节点(StateGraph),渲染树根节点(RenderStage),渲染信息(RenderInfo)。注意此 时状态树和渲染树还没有生成,我们还要设置渲染树构建所需的各种信息

    3、  “全局状态节点”和“局部状态节点”追加到状态树中

    4、  使用筛选访问器遍历场景中的节点,在遍历过程中将筛选出那些无法被用户看到的 对象,并将它们裁减掉,从而提高场景绘制的效率。

    for(unsigned int childNo=0; childNo<_camera->getNumChildren(); ++childNo)

      _camera->getChild(childNo)->accept(*cullVisitor);

    5、  对筛选访问器执行之后得到的 渲染树内容进行排序和精简

    6、  计算出场景中动态对象(DYNAMIC)的数目,并保存到 SceneView 的成员 变量_dynamicObjectCount 中,方便被 SceneView::getDynamicObjectCount 函数获取,并用于多线程模式下渲染 线程与场景更新的协调控制。

  • 相关阅读:
    【转】揭秘令牌桶
    各空白字符说明
    【转】Python正则表达式指南
    python的urlparse
    【转】HTTP Header 详解
    ElasticSearch(六)底层索引控制
    ElasticeSearch(五)分布式索引架构
    Elasticsearch(四)优化用户体验
    ElasticSearch(三)不仅仅是查询
    ElasticSearch(二) 关于DSL
  • 原文地址:https://www.cnblogs.com/lyggqm/p/6635992.html
Copyright © 2020-2023  润新知