[原][OSG]整理osg渲染一帧的流程
参考:最长的一帧
先看下frame
void ViewerBase::frame(double simulationTime)
{
advance(simulationTime);//记录仿真时间,帧数,收集弃用对象
eventTraversal();//处理键鼠响应,VPW矩阵,交互回调
updateTraversal();//更新节点访问器,分页数据,更新回调,相机操作,设置cullseting
renderingTraversals();//遍历渲染
}
eventTraversal()流程
1、取得事件队列的状态事件(EventQueue::getCurrentEventState鼠标键盘操作等);
2、取得主摄像机的视口范围(如果它存在的话,正如我们在前面所论述的,主摄像机并不一定存在Viewport视口也不一定存在GraphicsContext图形设备),并设置为事件队列的“响应范围”(EventQueue::setInputRange);
3、计算主摄像机的 VPW 矩阵。
观察矩阵(View Matrix),投影矩阵(Projection Matrix),视口矩阵(Window Matrix)
updateTraversal()流程
1、使用预设的更新访问器_updateVisitor,访问场景图形的根节点并遍历其子节点,实现各个节点和 Drawable 对象的更新回调。
2、使用DatabasePager::updateSceneGraph函数以及ImagePager::updateSceneGraph函数, 分别更新场景的分页数据库和分页图像库。
3、处理用户定义的更新工作队列_updateOperations。
4、执行主摄像机_camera 以及从摄像机组_slaves的更新回调(但是不会遍历到它们的子节点),像机回调的执行时机与场景节点有所区别的。
5、根据漫游器_cameraManipulator的位置姿态矩阵,更新主摄像机_camera的观察矩阵。
6、使用 View::updateSlaves 函数更新从摄像机组_slaves中所有摄像机的投影矩阵,观察矩阵和场景筛选设置(CullSettings,之后renderingTraversals会调用cull遍历)。
renderingTraversals()流程:
(题外话:OSG 中为精华也为复杂的组成部分,含有大量线程操作)
单线程模式下:
1、遍历视景器对应的所有 Scene 场景(Viewer 单视景器只存在一个场景),记录分页数据库的更新启动帧(使用 DatabasePager::signalBeginFrame,这将决定 DatabasePager 中的数据请求是否过期),并计算场景节点的边界球。
2、获取当前所有的图形设备(GraphicsContext)和摄像机。
3、遍历所有摄像机的渲染器(Renderer),执行 Renderer::cull 场景筛选的操作!
4、遍历所有的图形设备,设置渲染上下文(使用ViewerBase::makeCurrent)并执行 GraphicsContext::runOperations,实现场景绘制的操作!
5、再次遍历所有的图形设备,执行双缓存交换操作(GraphicsContext::swapBuffers)。
6、遍历视景器中的场景,告知分页数据库更新已经结束(DatabasePager::signalEndFrame, 目前这个函数没有作用)。
第3和4是重点。
特别关注
- 场景筛选的操作Renderer::cull 函数
- 执行图形设备GraphicsContext::runOperations 函数
场景筛选的操作Renderer::cull 函数流程:
1、首先从_availableQueue 队列中获取一个可用的场景视图(SceneView)。
2、执行 Renderer::updateSceneView 函数,更新这个场景视图的全局渲染状态
3、更新场景视图(SceneView)的融合距离(Fusion Distance)和筛选设置(CullSettings)。
4、执行 SceneView::cull 函数,这才是真正的场景筛选(裁减)工作的所在!!
5、将这个渲染视图添加到绘制队列_drawQueue 中,以便绘制
[原][OSG]整理osg渲染一帧的流程的更多相关文章
- [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件
参考: osgPlugins相关 osg读取文件的原理(插件工作机制) 当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现. 比如: osgviewer cow.o ...
- 探索未知种族之osg类生物---渲染遍历之认识SceneView
前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构, a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息: b ...
- [原][OSG]深入osg函数----SceneView::cull 函数
参考:最长一帧 先介绍几个类: osgUtil::CullVisitor:“筛选访问器” 当我们使用它遍历场景图形的各个节点时, CullVisitor 将会对每一个遇到的节点执行场景筛选的工作,判断 ...
- OSG 3D场景渲染编程概述
OSG是Open Scene Graphic的缩写,是基于C++平台的使用OpenGL技术的开源3D场景开发. vs环境安装或者是在Ubuntu中环境的安装网上教程很多,都是大同小异的,认真操作容易成 ...
- 探索未知种族之osg类生物---渲染遍历之器官协作
好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...
- 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介
我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...
- [原][osg][QT]osg与QT界面结合的简单例子二
//main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...
- [OSG][转]osg格式文件
转自:http://blog.csdn.net/timothyfly/article/details/7826139 osg格式文件中如何处理多个节点共享一个子节点 下面一段程序中,共有三个Group ...
- [转][osg][QT]osg与QT界面结合的简单例子
//QT += core gui opengl //LIBS += -losgViewer -losgDB -losgUtil -losg -lOpenThreads -losgGA -losgQt ...
随机推荐
- 怎么申请 bing api key
1:打开网址 https://login.live.com/ 注册帐号并登录(点击上图中的登录按钮即可),在新窗口点击下方的“立即注册”(有帐号的可以直接登录) 2:填写相关信息(推荐使用hotmai ...
- mybatis例子
mybatis的mapper不允许重载,因为它需要通过方法名称[不加签名]去查找需要执行的sql 1.批量删除 <delete id="deletePlanLocations" ...
- VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)
上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...
- 容器技术与DevOps
容器技术的使用支撑了目前 DevOps 三大主要实践:工作流.及时反馈.持续学习. 有人说容器技术与 DevOps 二者在发展的过程中是互相促进的关系.得益于 DevOps 设计理念的流行,容器生态系 ...
- x86,x64,Any CPU区别
https://blog.csdn.net/zuguangboy/article/details/51509670 1,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或 ...
- MySQL Crash Course #17# Chapter 25. 触发器(Trigger)
推荐看这篇mysql 利用触发器(Trigger)让代码更简单 以及 23.3.1 Trigger Syntax and Examples 感觉有点像 Spring 里的 AOP 我们为什么需要触发器 ...
- 高并发下,php使用uniqid函数生成唯一标识符的四种方案
PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方案是结 ...
- SACD ISO镜像中提取DSDIFF(DFF)、DSF文件
听语音 | 浏览:5620 | 更新:2015-08-25 11:46 | 标签:硬件 1 2 3 4 5 分步阅读 现在有一种比较流行的无损音乐传输介质是SACD ...
- CAN/J1850/
(1)CAN:(差分信号)有信号CANH=3.5V,CANL=1.5V, 没有信号CANH=2.5V,CANL=2.5V 速率:CAN系统又分为高速和低速,高速CAN系统采用硬线是动力型,速度:500 ...
- poj 1274 The Prefect Stall - 二分匹配
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22736 Accepted: 10144 Description Far ...