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

2023-10-27

这个主要是理论了。抄一抄。

最常用到场景管理方式时场景节点树结构,场景树顶点的叶节点osg::Geode包含了各种需要渲染的几何体的顶点和渲染状态信息;而组节点osg::Group及其派生出的各种特殊功能节点则作为场景树的各个枝节节点 ,它们也可以拥有不同的渲染状态;有且只有一个节点可以直接作为整个场景的根节点,使用setSceneData将其设置为场景的视景器系统,即等同于将整个场景树传递给OSG的渲染和显示系统。

而保存节点和几何体的各种渲染属性(osg::StateAttribute,例如纹理、雾效、材质,alpha校验等)和模式开关,则使用节点所附带渲染状态集osg::StateSet,一个状态集中可以包含多种不同的渲染属性和开关,处于场景树顶端的节点将继承并综合各级父节点的渲染状态,实现几何形状的正确渲染。

OSG渲染后台的主体是场景视图SceneView,它同样实现了树状结构的管理方式,并据此实现了多个专用于渲染工作的内部类。

osgUtil::CullVisitor筛选器:.当使用它遍历场景图形的各个节点时,CullVIsitor将会对每个遇到的节点执行场景筛选的工作,判断它是否会超出视截锥体外,过于渺小,或者被遮挡节点OcculuderNode挡住,从而将无助于场景浏览的物体筛选并剔除,降低场景绘制的资源消耗。也可以构建自己设计的筛选访问器,但是在系统渲染后台之外的化境使用CullVisitor通常无用处。

osg::RenderInfo:渲染信息管理器。

 

osgUtil::StateGraph:状态节点。可以对比场景树的组节点,可以将StateGraph理解为OSG渲染后台的组节点。它的组织结构与场景图形的节点结构类似,但是状态树的构建主要以节点的渲染状态集StateSet为依据:设置了StateSet的场景节点,其渲染状态会被记录到状态节点中,并保持它在原场景树中的相对位置。状态节点采用映射表std::map来组织它的子节点,同一层次的子节点如果渲染状态相同,则合并到同一个状态节点中。

StateGraph可以时是状态树中的任意深度的节点,可以有子节点。但不是整棵树,而是树上的某个节点,可以当作组。与对应场景树的位置保持一致,把状态放到渲染后台状态树对应位置。即两棵树,场景树放场景节点,另一棵树的同一位置是该场景节点的状态节点。

 

osgUtil::RenderLeaf:渲染叶。渲染叶是OSG渲染后台状态树的叶节点,但不是场景树的Geode节点,而是Geode的各个drawables(以及与之相关的投影矩阵,模型视点矩阵等信息)。每个状态节点中都包含了一个渲染叶的列表,但是只有最末端的状态节点会记录场景中的渲染叶。

即,状态树由状态节点StageGraph和渲染叶节点RenderLeaf组成。

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

通常来说,由于osg后台只有一个渲染树结构,因此应当也只有一个渲染台存在,不过OSG还提供了设置摄像机渲染顺序的功能,即

设置为PRE_RENDER的摄像机子树将在主摄像机之前执行渲染,通常,可以实现如纹理烘焙(render to texture)的高级功能;设置为Post_render的摄像机子树将在主摄像机之后执行渲染,一些必须在最后进行渲染的场景对象,比如HUD显示牌,可以置为这类摄像机的子节点。

把视景器viewer的主从摄像机设置为PRE_RENDER或Post_render往往没有意义。所谓从摄像机组,主要功能主要是实现同一场景的分窗口及分屏幕显示。如果希望实现如HUD显示等功能,则应当向场景树中添加新的摄像机节点,并设置与主摄像机不同的观察矩阵和投影矩阵。

 

一般对于没有特殊要求的场景渲染来说,更多的渲染树分支也许并不需要;场景中需要渲染的元素及其渲染属性被保存到各个状态节点和渲染叶中;渲染树只要按照遍历的顺序,把这些数据记录到作为根节点的渲染台中,(即分别保存在std::vector成员量RenderBin::_stateGraphList和RenderBin::_renderLeafList中,注意RenderStage派生自RenderBin),就可以执行场景的绘制工作了。

 

如果正常渲染,从场景树中,相对位置不变可以获得状态树,状态树由状态组成的状态节点和drawable组成的渲染叶组成;再把状态节点挪到渲染台即可。默认渲染顺序为0,即

stateset->setRenderBinDetails(0,"");

然而,事情不那么简单,比如透明的和不透明的节点,绘制顺序不同的节点,这样引入了下面的

osgUtil::RenderBin:渲染元,是OSG渲染树的分支节点,用于某些几何体在其它对象之前绘制,

设置顺序时,整数表示以0为标准,小于0的渲染状态集(即包含了这个StateSet的StateGraph状态节点)将排列在前,大于0的排列在后。

字符串参数"RenderBin"表示在渲染树中新建分支进行渲染,可用于不透明物体;按升序渲染;

字符串参数"DepthSortedBin"表示新建渲染树分支,并且所有要渲染的顺序将按照深度值降序进行排列,按降序渲染。

即三个分支:正常为0的,Renderbin排序的不透明和DepthSortedBin排序的透明物体。

顺序是先渲染不透明的,再渲染透明的;

那么先渲染RenderBin中负数,从小到大;再渲染正常的;再渲染RenderBin中正数的从小到大;再按降序渲染DepthSortedBin中透明的。理论上应该这么排序。

当然,也可以简单地按照次序去排,前提是保证次序不错。

比如stateSet->setRenderBinDetails(-1,"RenderBiin");

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

对于不透明的物体,可以设置为

stateSet->setRenderingHint(OPAQUE_BIN);

对于透明的物体,可以设置为

stateSet->setRenderingHint(TRANSPARENT_BIN);

 

这是目前的理解,看看下一天的内容,是不是正确的。

 

 

 

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

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

  • 第二天(七)osg::Object* readObjectFile_const std::string& filename_const ReaderWriter::Options* options

    目前流程是 osgViewer viewBase frame viewerInit 创建帧事件 并将漫游器与事件和视口相关联 gt osgViewer Viewer ViewerInit gt osgViewer View Init gt
  • 调试最长的一帧(第19天)

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

    由于前面是简单的demo 所以不用管渲染次序 然而 实际项目中 会出现多种渲染方式 这时候就要用到 camera gt setRenderOrder osg Camera PRE RENDER 还要加上具体次序 比如 采样摄像机设为2 处理
  • osg传递数组到shader,(以qedl为例)

    一 对float类型的数组 osg ref ptrosg FloatArray m dampingPixelDist 赋值 void ccBilateralFilter updateDampingTable m dampingPixelDi
  • 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 进行剔除绘制的 如何进入的呢 其实很简单 逆推下 最后 回到梦开始的地方
  • 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
  • 调试最长的一帧(第16天)

    终于到达绘制了 先看总体流程阶段 然而 从并行堆栈上看 已经有渲染线程开启了 跟着电子书走 先是介绍 抄一抄 加深印象 osg的场景渲染过程可以简单地分为三个阶段 用户APP阶段 更新用户数据 负责场景对象的运动和管理等 筛选cull阶段
  • 调试最长的一帧(第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函数 在遍历节点时调用 则负责根据
  • 调试最长的一帧(第十天)

    依照惯例 先看总体流程 到了更新回调 一边抄一边记忆 OSG更新回调的作用与事件回调有类似之处 由专门的访问器对象 updateVisitor负责场景图形更新遍历 所有的节点和Drawable几何体对象都可以使用setUpdateCallb
  • osgFBO(十二)深度纹理与颜色纹理混合

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

随机推荐

  • Jaxb annotation初步使用

    今天在阅读cxf官方文档的时候遇到一种用法主要真对Map类型的复杂对象处理 WebServicepublicinterface HelloWorld String sayHi String text Advanced usecase of
  • Keil5 点击Debug Setting 软件崩溃解决方法

    因为我我打开另外一个程序是可以仿真的 所以没有考虑keil5软件自身的问题 1 有中文路径 然后剪切到没有中文路径的文件夹 gt 未解决 2 打开注册表 Win R键呼出 运行 在框内输入 Regedit 回车打开注册表 如果弹出 是否允许
  • Python时间格式转换

    概述 strptime 与strftime 若仅转换时间格式使用strftime 若需要做时间操作则使用strptime 1 strptime 中的p指parse 解析 一般解析都是说对字符串进行解析 所以strptime 方法是将字符串解
  • Yapi接口一键生成Java代码

    文章目录 一 简介 1 这是什么 2 有啥用 3 为什么要用 二 快速开始 1 下载 2 配置 3 运行 三 版本说明 v1 0 0 v1 0 1 四 Github项目地址 一 简介 1 这是什么 这是一个Java代码生成器 2 有啥用 能
  • IDEA如何生成 serialVersionUID

    序列化和反序列化 Java是面向对象的语言 与其他语言进行交互 比如与前端js进行http通信 需要把对象转化成一种通用的格式比如json 前端显然不认识Java对象 从对象到json字符串的转换 就是序列化的过程 反过来 从json字符串
  • import-from

    1 import from可以导入什么文件 通过import from 导入时 from后的来源可以是js vue json 这个是在webpack base conf js中extensions设置的 该属性值默认是js vue json
  • 深度学习入门资料整理

    深度学习基础总结 无一句废话 附完整思维导图 深度学习如何入门 知乎 深度学习入门基础讲义 shuzfan的博客 CSDN博客 深度学习入门 神经网络15分钟入门 足够通俗易懂了吧 知乎 深度学习基础知识点梳理 知乎
  • MQ-2烟雾传感器代码(STM32单片机驱动)

    MQ 2烟雾传感器代码 STM32单片机驱动 MQ 2烟雾传感器简介 接线 三级目录 MQ 2烟雾传感器简介 MQ 2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 SnO2 当烟雾传感器所处环境中存在可燃气体时 烟雾传感器的
  • 什么是 BFC?

    3 BFC的规则 BFC就是一个块级元素 块级元素会在垂直方向一个接一个的排列BFC就是页面中的一个隔离的独立容器 容器里的标签不会影响到外部标签垂直方向的距离由margin决定 属于同一个BFC的两个相邻的标签外边距会发生重叠计算BFC的
  • 在线吉他调音

    先看效果 图片没有声 可以下载源码看看 比这更好 再看代码 查看更多
  • 输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)

    效果视频 输电线路故障诊断 Python代码 逻辑回归 决策树 随机森林 XGBoost和支持向量机五种不同方法诊断 哔哩哔哩 bilibili 项目文件 code py装载的是英文版本 图上显示英文标签及坐标 Chinese py装载的是
  • chisel快速入门(三)

    前一篇见此 chisel快速入门 二 沧海一升的博客 CSDN博客简单介绍了chisel 使硬件开发者能快速上手chisel https blog csdn net qq 21842097 article details 121418806
  • Windows11 WSL子系统ubuntu22.04 修改hostname

    大家都知道以往我们修改 Linux系统的 hostname只要修改 etc hostname 这个文件中的名字即可 但是在WSL中修改该文件是无法生效的 要修改Hostname并使它生效 我们必须修改 etc wsl conf 文件 编辑配
  • Anaconda环境的一些常用命令

    首先 在开始中找到Anaconda Prompt 这个窗口和cmd窗口一样的 1 查看有哪些环境 输入命令 conda info e 2 如何查看Anaconda中安装了哪些第三方库 用 conda list 或者 pip list 命令来
  • SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑

    目录 背景介绍 设计思想 登录前的时序图 登录后的时序图 back内部认证逻辑的设计 LoginFilter内部流程 JwtFilter内部流程 filter流程说明 权限校验 总结 背景介绍 我们现在开发WEB应用最流行的框架就是Spri
  • 【Java学习】-Java JDK 1.8与17版本比较

    前言 Java Development Kit JDK 是Java编程语言的开发环境 它包含了Java编译器 javac Java虚拟机 JVM 以及其他必需的工具和库 本文将比较JDK 1 8和17两个版本 分析它们的发展历史和地位 并探
  • 十二届蓝桥杯青少年Python组省赛试题

    一 选择题 第一题 设s Hello Lan Qiao 执行print s 4 11 输出的结果为 选择题严禁使用程序验证 A lo Lan Qi B lo Lan Q C o Lan Qi D o Lan Q 第二题 循环语句for i
  • Java 示例代码,它演示了如何使用 Java Swing 创建一个简单的图形用户界面(GUI)应用程序:

    import javax swing JFrame import javax swing JLabel import javax swing JButton import java awt event ActionListener impo
  • for与while的优缺点

    在循环次数已知的情况下 for循环的形式更加简洁 而循环次数无法预知时 用while循环实现更合适 用特定条件控制循环是否执行 循环体中执行的语句可能导致循环条件发生变化
  • 调试最长的一帧(第19天)

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