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

2023-11-07

电子书上给了个例子,抄一抄,加深下印象,也验证下以前的想法对不对

对于场景实例

其中"ss"加上数字代号来标识这些Stateset对象,后面括号中的两个参数分别表示setRenderBinDetails的两个设置项("-"表示空字串,"R"表示"RenderBin","D"表示"DepthSortedBin"

ss03->setRenderBinDetails(0,"");   //缺省设置

ss11->setRenderBinDetails(0,"");

ss13->setRenderBinDetails(-1,"RenderBin");

ss14->setRenderBinDetails(1,"RenderBin");

ss15->setRenderBinDetails(10,"DepthSortedBin");

ss16->setRenderBinDetails(10,"DepthSortedBin");

关于状态集,对于叶节点_geode3,以及所有六个几何对象均设置了关联的渲染状态集(StateSet),且几何体1,2共用一个stateset。osg中所有的Drawable几何体对象都会自动关联一个StateSet对象,无论用户是否在陈鼓中设置。

进入渲染后台后,OSG将为这个场景生成“状态树",它是由”状态节点“StateGraph和渲染叶RenderLeaft组成。

上图的状态根节点和局部状态节点都是由状态树自动生成的。其中后者的主要工作是保存和维护一些渲染后台自动创建的渲染属性;而全局状态节点则保存了一个名为_globalStateset的全局渲染状态集对象,它的取值是场景主摄像机的StateSet.。换句话说,任何对状态树的遍历都将首先及至场景主摄像机的渲染状态,然后才是各个节点的渲染状态,这就是_globalStateSet的功用所在。

状态树的构建规则

1,状态树是根据渲染状态stateset来生成的,那些没有设置Stateset的场景节点不影响状态树的架构

2,场景中的Drawable对象在状态树中被置入分别的渲染叶(RenderLeaf)中,而一个或多个渲染叶必然被一个状态树末端的节点StateGraph拥有。

3,共享同一个渲染状态的Drawable对象(图中的_drawable1和_drawable2)在状态树中将置入同一个末端节点。

 

可见,我上节中考虑的是错误的,以为和场景图架构相同,其实毫不相干。

 

生成状态树的同时,OSG渲染后台还将生成对应的渲染树,其组成为一个RenderStage和多个RenderBin,如果都是默认状态(渲染顺序0),则所有状态树的末端节点(其中必然包括一个或多个渲染叶)都会按遍历顺序保存到渲染树根节点(渲染台)中,即可构建渲染树完毕。然而,由于对场景中部件得渲染树顺序

 

可见,setRenderBinDetails()的值有0,-1,1,10共四种。

 

如果叶节点3 _geode3也设置为1,且用"RenderBin"或者”DepthSortedBin"方式,按照指定的渲染顺序号来绘制,那么在渲染树_geode3节点及其附带的几何体将构成更复杂的结构形式,如

ss03->setRenderBinDetails(1,"RenderBin");

虽然ss03和ss14的渲染细节设置完全一样,但是由于关联ss03和ss14的节点之间是父子关系,它们不能放入同一个渲染元,还取决于两个Stateset对象在状态树中所处的层次。

 

感觉和我以前想象的还是有区别的。

 

电子书上的总结,抄一抄。

osgUtil::StateGraph:状态树的分支节点(状态节点),负责管理和绘制场景树中的一个渲染状态(StateSet)对象,末端的StateGraph节点还负责维护一个渲染叶RenderLeaf列表。

osgUtil::RenderLeaf:状态树的叶节点(渲染叶),负责管理和绘制场景树末端的一个几何体(Drawable)对象。

osgUtil::RenderStage:渲染树的根节点(渲染台),负责管理默认渲染树徐的所有末端StageGraph节点(附带渲染叶),并保存了谦虚渲染和后续渲染的渲染台指针列表。

osgUtil::RenderBin:渲染树的分支节点(渲染元),负责管理自定义渲染顺序的末端StateGraph节点(附带渲染叶);渲染树的根节点和分支节点只能有"RenderBin"和"DepthSortedBin"两类子节点,但可以根据不同的渲染顺序号衍生出多个子节点,它们在渲染时将按顺序号升序的此粗执行绘制。

 

 

大概明白了,就这样吧

 

 

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

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

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

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

    一 对float类型的数组 osg ref ptrosg FloatArray m dampingPixelDist 赋值 void ccBilateralFilter updateDampingTable m dampingPixelDi
  • 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
  • 调试最长的一帧(第七天)

    先看看总体进展 eventTraversal函数的任务 在每帧仿真过程中 取出已经发生的所有事件 摒弃哪些对场景不会有助益的 比如 在视口外的鼠标事件 依次交付给各个事件处理器 最后清空现有的事件队列 等待下一帧的到来 在View的几个成员
  • osg fbo(三),将颜色缓冲区图片通过shader变绿

    这个其实很简单 一 写顶点着色器和片元着色器 static const char vertexShader void main void n n gl Position ftransform n n static const char ps
  • 调试最长的一帧(第17天)

    先看看流程 电子书上介绍了渲染器osgViewer Renderer类 osgViewer Renderer为摄像机渲染场景的工作提供了一个公共接口 当我们向视景器viewer添加了一个新的摄像机camera时 一个与摄像机相关联的渲染器R
  • 调试最长的一帧(第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为止
  • osg fbo(四),将颜色缓冲区图片中的牛通过shader变绿

    osg fbo 三 中 把整个屏幕变绿了 因为是把shader添加到了颜色缓冲区图片上了 如果只想把牛变绿 就需要把shader添加到原始场景根中 即 osg ref ptr
  • osgFBO(十二)深度纹理与颜色纹理混合

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

随机推荐

  • C# LINQ分组求最大、最小、平均值

    C LINQ分组求最大 最小 平均值 private void GroupBy List
  • 使用Python保存`requests`请求的文件的代码

    使用Python保存requests请求的文件的代码 在Python中 你可以使用requests库发送HTTP请求 并且可以很方便地保存请求返回的文件 下面是一个示例代码 演示了如何使用requests库发送请求并保存文件 import
  • Webpack/Babel/⼯程化 笔试题精讲1

    核 概念 entry webpack 构建第 步 output 输出 loader 模块转换器 于将模块的原内容按照需求转换成新内容 plugin 扩展插件 在 webpack 构建过程的特定时机注 扩展逻辑 来改变或优化构建结果 mode
  • 【Java】NIO和BIO有什么区别?回答:天壤之别

    引流 第一时间阅读最新文章的方式 Java NIO和BIO有什么区别 答案 天壤之别 Java NIO不简单呐 Channel Buffer Selector 一 什么是NIO 1 概念 NIO是java1 4中引入的 被称为new I O
  • 一堆小技巧--常见写法的优化(持续更新。。)

    不用定义变量来交换两个数的值 int temp a a b b temp 可以替换成 a a b b a b a a b 详情见小技巧 使用异或来替换原本的常量交换 使用 gt gt 替换原来的 2取中点 int mid left righ
  • blender翻转渲染图

    想要实现如下功能 翻转生成的渲染图 在blender里设置物体属性的scale 翻转哪个轴就在哪个轴取反 翻转X轴的效果 翻转Y轴的效果
  • CSS定位知识点补充(父相子绝)

    定位 定位 定位模式 position 边偏移 top right bottom left 定位模式 用于指定一个元素在文档中的定位方式 边偏移则决定了该元素的最终位置 静态定位 position static 元素的默认定位方式 无定位的
  • C++ Most vexing parse(C++最头疼的解析)

    首先需要了解 在C 中 如下三种方式声明了同一个函数 int f double d 声明接受一个double参数d 返回值为int类型的函数 int f double d 效果一样 参数名外的括号会被忽略 int f double 直接省略
  • Spring框架中的缓存管理详解

    标题 Spring框架中的缓存管理详解 摘要 本文将介绍Spring框架中的缓存管理 探讨如何使用Spring提供的缓存注解和配置来提升应用的性能 通过详细说明缓存的概念 应用场景以及示例代码 帮助读者理解和使用Spring中的缓存管理 1
  • AI实战训练营(Class 11)MMEditing 安装与使用

    AI实战训练营 Class 11 MMEditing 安装与使用 安装配置 MMagic 安装 Pytorch 安装 MMCV 和 MMEngine 环境 安装 MMagic 从源码安装MMagic 检查安装成功 安装其它工具包 黑白照片上
  • argsort()函数

    argsort 函数是对数组中的元素进行从小到大排序 并返回相应序列元素的数组下标
  • Flink的Standalone集群部署

    在上篇进行单机的Standalone部署 Flink的Standalone部署实战 本篇介绍Flink的Standalone集群部署 Flink集群为主从架构 主是JobManager 从为TaskManager 支持一主多从 本次搭建环境
  • 代码源div1二分答案(前缀和+贪心+二分)

    include
  • live常见问题:如何降低Ableton Live Suite的CPU负载?

    Ableton Live 11 Suite for Mac是Mac平台上能够用于创建和录制音乐的音乐制作软件 软件本身就占用的很大的内存空间 如果下载的其插件和固件的话 会大大增加CPU的负荷 那么如何降低Ableton Live Suit
  • 【Go语言例题】迷宫的广度优先搜索

    Go语言例题 迷宫的广度优先搜索 用循环创建二维slice 使用slice来实现队列 用Fscanf读取文件 对Point的抽象 Fscanf在遇到 n才结束 遇到 r时就会把 r替换成0 这就有个问题 要注意自己的文本换行符是什么 在Wi
  • 使用Gitee去拉取项目和上传项目

    关于Gitee的使用是为了我们更的好去使用Git上传自己的代码 和托管项目也有助于团队的开发 也可以上传到Gitee官网去分享和开源自己的项目 这里我们就开始给大家介绍怎么去用IDEA去创建一个项目和配置我们的Gitee 1 用IDEA去创
  • Android之aar包中R文件混淆问题

    发现问题 解决问题要对症下药 先看报错日志 java lang NoSuchFieldError No static field a of type I in class Lcom R layout or its superclasses
  • Event-based Stereo Visual Odometry(双目事件相机里程计)论文学习

    本文详细介绍一篇双目事件相机里程计的论文 Event based Stereo Visual Odometry 港科大沈邵劼团队Yi Zhou和TU Berlin的Guillermo Gallego共同完成 并公布了代码 我准备在接下来一段
  • 什么是高性价比的测试,性价比高的软件测试类型有哪些?

    有人说 软件测试是一个经济学问题 我们希望对软件进行最充分的测试 发现最多的潜在问题 然而测试的资源 人力 时间 是有限的 如何用有限资源获取最大利益 是我们要思考的问题 软件测试的类型在100种以上 显然 并不是每一种软件测试活动都有同样
  • 调试最长的一帧(第20天)

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