调试最长的一帧(第22天)

2023-11-01

先看看全流程

 

 

先抄一抄节点访问器NodeVisitor的工作原理.当我们执行节点的accept(NodeVisitor* nv)函数时,当前节点自动调哟个NodeVisitor::apply方法,将自身的信息传递给节点访问器nv,由它负责执行相应的处理工作;然后节点将自动执行Node::traverse函数,调用所有子节点的accept函数,从而实现了节点数的遍历。在遍历的过程中,每个节点都会调用NodeVisitor::apply,将自身的指针传递给访问器,因此,NodeVisitor的每个派生类都会重载针对各个节点的apply函数,以实现针对不同类型节点的访问操作。

 

来个最简单的不向下走,调用

可以看到,apply()是accept调用的

 

下一步接下来递归调用


#include <osg/NodeVisitor>
#include <iostream>
#include <osg/Group>
#include <osg/Geode>

using namespace osg;
class myVisitor : public osg::NodeVisitor
{
public:
    myVisitor() : NodeVisitor(TRAVERSE_ALL_CHILDREN)
    {

    }
    virtual void apply(Node& node)
    {
        std::string strName = node.getName();
        std::cout << strName << std::endl;
        traverse(node);
    }
    virtual void apply(Group& grp)
    {
        std::string strName = grp.getName();
        std::cout << strName << std::endl;
        traverse(grp);
    }
    virtual void apply(Geode& geode)
    {
        std::string strName = geode.getName();
        std::cout << strName << std::endl;
        traverse(geode);
    }
};
int main()
{
    osg::ref_ptr<osg::Node> node = new osg::Node;
    node->setName("node");
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    geode->setName("geode");
    osg::ref_ptr<osg::Group> group = new osg::Group;
    group->addChild(node.get());
    group->addChild(geode.get());
    group->setName("group");
    myVisitor nv;
    group->accept(nv);
    return 0;
}

 

 

 

 

运行结果

继续抄抄电子书,筛选访问器(cullvisitor)的重载函数针对Geode,Billboard,LightSource,ClipNode,TexGenNode,Group,Transform,Projection,Switch,LOD,ClearNode,Camera,OccluderNode,OcclusionQueryode以及通用的Node类节点执行了相应的筛选工作

 

下面进行cullVisitor的使用

 

 

 

可以通过Node::setCullingActive()保持节点Node永远不会被删除

 

 

 

看看几个相关的成员变量,

 

 

 

 

 

电子书上介绍了其它几种。

它的不同之处在于

 

对于Geode节点

不同的地方如下

 

当场景树中出现一个摄像机节点时它以下的场景子树将按照这恶摄像机的筛选、视口、观察矩阵和投影矩阵设置进行显示。我们也可以使用此摄像机指向另一个图形设备(窗口),Camera节点的特性使得HUD文字,鹰眼图等效果都可以在OSG的场景中轻松实现。

除去类似的步骤,具体如下

 

 

 

 

 

 

 

最后,进行例行的弹出

 

总结下,Cullvisitor用于构建OSG系统的状态树和渲染树,并在这一过程中使用isCulled函数剔除了场景中对渲染没有助益的对象(在下次遍历时,还会重新审核所有的节点,上次被剔除的节点可能在新的循环中将被显示出来)

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试最长的一帧(第22天) 的相关文章

  • 调试最长的一帧(第27天)

    对于几个多线程渲染中的成员变量 继续抄一抄 Block阻塞器 BlockCount 计数器类 它与阻塞器类的使用方法基本相同 block 阻塞线程 release 释放线程 不过除此之外 BlockCount的构造函数还可以设置一个阻塞计数
  • 调试最长的一帧(第19天)

    这个主要是理论了 抄一抄 最常用到场景管理方式时场景节点树结构 场景树顶点的叶节点osg Geode包含了各种需要渲染的几何体的顶点和渲染状态信息 而组节点osg Group及其派生出的各种特殊功能节点则作为场景树的各个枝节节点 它们也可以
  • osgFBO(十四)PrerenderOrder的使用

    由于前面是简单的demo 所以不用管渲染次序 然而 实际项目中 会出现多种渲染方式 这时候就要用到 camera gt setRenderOrder osg Camera PRE RENDER 还要加上具体次序 比如 采样摄像机设为2 处理
  • osgFBO(十)多pass-3,pass3,shader将背景从绿色变为蓝色

    pass3和pass2类似 只是再熟悉下 这个Pass设定为最后一步 可以不再输出纹理 即 1 pass3摄像机输入tex2 osg ref ptr
  • qedl中的fixDepth()简化

    如果将PerspectiveMode的设置为1 则会传递zNear和Zfar 在fixDepth 中 而将perspectiveMode 0 则大大简化fixDepth float fixDepth float depth return c
  • osg fbo(一),生成颜色缓冲区图片

    由于工作需要 重新捡了下shader 很明显 fbo是重中之重 好记性不如烂笔头 先记录下 1 生成一个颜色纹理 为了省事 可以将纹理宽高 屏幕宽高 osg ref ptr
  • SingleThreaded是如何进入cull_draw()的?

    正如以前所说 单线程模式是通过cull draw 进行剔除绘制的 如何进入的呢 其实很简单 逆推下 最后 回到梦开始的地方
  • 调试最长的一帧(第22天)

    先看看全流程 先抄一抄节点访问器NodeVisitor的工作原理 当我们执行节点的accept NodeVisitor nv 函数时 当前节点自动调哟个NodeVisitor apply方法 将自身的信息传递给节点访问器nv 由它负责执行相
  • 调试最长的一帧(第12天)

    先看看总体 流程走到了更新分页数据库 分页数据库的数据流图 先找上图的4个成员变量 上图中 左侧的图框表示数据的检索和输入 中间的白色图框表示用于数据存储的内存空间 而右边的图框表示存储数据的输出 此外 蓝绿色图框表示可以在DataBase
  • osgFBO(九)多pass---2,pass2,shader将背景从红色变为绿色

    二 pass2是比较完整的 同时有输入纹理和输出纹理 与pass1类似 这里只列出不同的地方 1 pass2摄像机输入tex1 osg ref ptr
  • 调试最长的一帧(第八天)

    先看看总体进度 先获取所有的图形上下文 然后进行checkEvents 请求分发消息并通过takeEvents 获取交互事件 再交由GUIEventHandler处理交互事件 中间的步骤 在checkeEvents里面 消息分发函数 消息处
  • ViewerBase::renderingTraversals()的简易理解

    前两篇说到了camera用来剔除 context用来渲染 多线程渲染就是把cpu尽可能的分配给context 如果土豪的话 在剔除过程也分配cpu 另外 也要注意到过期请求数据不处理 当然 首先要获取场景 摄像机和上下文 现在看下摄像机剔除
  • 分页数据库其实就是两个生产者与消费者

    再次看osg 最长的一帧 因为分页数据库适合于PagedLod和ProxyNode 一般调试还得准备数据 比较麻烦 突然想起 和我以前封装的引擎类似 分页数据库就是几个生产者与消费者 回过头来看这个图 看似复杂 实际上并不复杂 如果简化 只
  • 调试最长的一帧(第20天)

    电子书上给了个例子 抄一抄 加深下印象 也验证下以前的想法对不对 对于场景实例 其中 ss 加上数字代号来标识这些Stateset对象 后面括号中的两个参数分别表示setRenderBinDetails的两个设置项 表示空字串 R 表示 R
  • 调试最长的一帧(第14天)

    看看流程 可见分页数据库的更新也是和场景的筛选绘制是同时进行的 再看看大图 第14天要进行左下角的 依照惯例 跟过去 现在开始步入正轨 发现第0个fileName为空 这是有问题的 创建pagelod时修正为 这次进来了 在这里删除 放入r
  • 第二天(八)osg::Object* readObjectFile(const std::string& filename,const ReaderWriter::Options* options)

    目前流程是 osgViewer viewBase frame viewerInit 创建帧事件 并将漫游器与事件和视口相关联 gt osgViewer Viewer ViewerInit gt osgViewer View Init gt
  • osgfbo(六)从pass的角度考虑,改写fbo(二)

    什么是pass 这个问题 看似简单 也让我头疼 看了osgdefered pass定义为osg Camera 杨石兴的osg视频教程定义为osg Group 我认为一个passRoot可以定义为一个Group 包含三部分 到目前pass为止
  • 调试最长的一帧(第21天)

    看看全流程 主要讲sceneview cull 跟过去 重点在cullstage 状态树与渲染树的构建都是在pushStateSet和popStateSet函数中完成的 而CullVisitor apply函数 在遍历节点时调用 则负责根据
  • 调试最长的一帧(第23天)

    看看总体进度 第22天通过CUllvisitor创建了渲染树和状态树 并进行必要的剔除 接下来进行排序和优化 RenderStage sort函数时按照前序渲染台 当前渲染台和后续渲染台的顺序进行 其中前序渲染台和后续渲染台通过Camera
  • osgFBO(十二)深度纹理与颜色纹理混合

    前面涉及到了深度纹理和颜色纹理 由于qedl中 也要两者混合 所以 要考虑到两者混合 这里只是简单将其相加 一 设置纹理 采样颜色纹理 osg ref ptrosg Texture2D texColor createFloatRectang

随机推荐

  • 21天 Jenkins打卡-Day1 环境准备

    第1天作业 1 确保自己已经有一台Linux服务器 且通过SSH客户端 SecureCRT Xshell 等都可以 链接上服务器 2 你的服务器发行版 Centos Ubuntu 等 3 在你的Linux服务器上 安装jdk8 4 验证安装
  • vue结合el-dialog 封装自己的confirm二次确认弹窗

    这里使用el dialog 主要是用他的关闭动画 让关闭更加丝滑 首先在components 添加 ConfirmAlert文件夹 然后添加vue和js 文件 index js import Vue from vue import conf
  • pi控制直流电机c语言,一种基于PI控制的直流电机调速控制系统及控制方法与流程...

    本发明属于传感器技术领域 具体涉及种一种基于PI控制的直流电机调速控制系统及控制方法 背景技术 直流电机有广泛的应用 如何控制和调整电机的转速是工程和实验领域要解决的问题之一 通常采用PWM波控制电机的转速 根据PWM波的占空比调整电机的转
  • java基础案例4-4学生和老师

    package com itheima import java util Scanner abstract class Person void speak class Teacher extends Person private Strin
  • 查看浏览器token

    很简单
  • QT进行http请求(post/get)

    在刚接触QT时第一个任务就是进行http请求 现在才开始记录 可能会有遗漏的点 一 post请求 在 pro文件中 QT network 在 h文件中添加对应的头文件 include
  • 通用业务平台设计(五):预警平台建设

    前言 在上家公司 随着业务的不断拓展 从支持单个国家单个主体演变成支持多个国家多个主体 对预警的诉求越来越紧迫 如何保障业务的稳定性那 预警可以帮我们提前甄别风险 从而让我们可以在风险来临前将其消灭 每个业务组写自己的报警规则会极大的降低开
  • 【基于springboot + vue 的作业管理系统的设计与实现】

    获取 http mtw so pwd 6fSSgK 密码 123456 本文介绍了一个基于springboot vue 的作业管理系统的设计与实现 该系统主要包括学生端和教师端两个模块 学生端可以查看作业要求 上传作业文件 查看作业成绩和评
  • CPU性能测试项

    CPU性能测试项 一 思维导图 二 CPU简介 中央处理器 CPU 是电子计算机的主要设备之一 电脑中的核心配件 其功能主要是解释计算机指令以及处理计算机软件中的数据 CPU是计算机中负责读取指令 对指令译码并执行指令的核心部件 中央处理器
  • 2021年认证杯-数学建模

    认证杯 2021年数学建模网络挑战赛 认证杯的含金量其实还算数学建模里较高的 获奖证书上是全国比赛 而非赛区 比赛分为第一阶段和第二阶段 还会有全球数学建模能力认证中心 中国运筹学会 内蒙古自治区数学学会的盖章认可 建议大家去踊跃报名 如果
  • PCIE总线基本介绍(和PCI总线差异、速率计算、引脚定义)

    1 PCI和PCIE的差异 1 PCIE协议在软件编程上是兼容PCI协议 不同在于PCIE和PCI的控制器 2 PCIE是差分串行信号线 PCI是电平并行信号线 3 PCI协议使用INTA INTB INTC INTD 四根中断线来触发终端
  • openGL之API学习(九十五)glProgramBinary

    将着色器程序的二进制数据加载进着色器程序 二进制数据由glGetProgramBinary生成 使用二进制数据可以避免编译开销 并且不用呈现shader的源代码 OpenGL并不指定任何二进制格式 二进制格式完全由各个实现的供应商决定 这意
  • 常见的浏览器css和js兼容性问题汇总

    无论是在工作或者面试中 总会遇到关于浏览器兼容性的问题 往往会感到一头雾水不知从何说起 于是我结合一些工作经验及从网上搜集的一些资料对此做了一些汇总 希望对从事前端工作的朋友们起到一些帮助 css 1 初始化样式 由于浏览器对标签的默认支持
  • 公司刚来的00后真卷,上班还没2年,跳到我们公司起薪20k....

    都说00后躺平了 但是有一说一 该卷的还是卷 这不 前段时间我们公司来了个00后 工作都没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太
  • VLOG旅游类短视频如何通过抖音进行变现?运作模式有什么精髓之处?不妨了解下

    旅行日渐成为大众生活中不可或缺的一部分 大众除了利用常规拍照 拍视频的方式 来记 录旅程 volg 也走入大众视线以及短视频舞台中心 打开抖音 你能频繁刷到关于旅行 美食 学习 日常等各种主题的 vlog 博主账号 抖音 是现在年轻人每天不
  • EchartsBar 双柱状图显示数据

    需求 两组数据柱状图无缝对比 柱状上方显示数字 X轴无刻度线 背景轴线虚线指定颜色 图表代码 barChart myChart date bar1Data bar2Data myChart setOption legend 图例组件的位置
  • Cron表达式详解(配合例子)

    这里写目录标题 Cron 表达式 1 基本格式 2 一些特殊值的含义 四种 通用 特殊字符 五种有使用限制的特殊字符 L W LW 3 各个域的取值范围 Cron 表达式 在进行定时任务的创建的时候 cron是计划任务的表达式 本文意在快速
  • element table cell-style设置

    当表格中某行或者某个文字 需要单独设置 在表格table中加入 cell style cellStyle
  • 甲骨文全区登录地址

    日本东部 东京 https console ap tokyo 1 oraclecloud com https console ap tokyo 1 oraclecloud com 日本中部 大阪 https console ap osaka
  • 调试最长的一帧(第22天)

    先看看全流程 先抄一抄节点访问器NodeVisitor的工作原理 当我们执行节点的accept NodeVisitor nv 函数时 当前节点自动调哟个NodeVisitor apply方法 将自身的信息传递给节点访问器nv 由它负责执行相