那我们回到ViewerBase::frame函数中来,继续看看为什么osg生命刚刚出生的时候会大哭,除了初始化了eventQuene和cameraManipulator之外还对那些器官进行了初始化。在这之前我们先介绍一下上一节说到的osg的肢体或者器官但是没有展开介绍的。

前言

osgGA::GUIEventAdapter,GUI事件适配器。它就是对所有平台windows linux mac平台上的鼠标、键盘、以及其他的窗口事件进行了封装,目的是使接口统一,用户在使用osg库的时候不用再自己区分平台,直接调用GUIEventAdapter就可以得到平台发过来的事件信息。特别是我们处理自定义的EventHandler事件处理器的时候重写handler (const osgGA::GUIActionAdapter &ea ,osgGA::GUIActionAdapter &aa)的时候一定会用到。

osgGA::GUIActionAdapter,这个内脏器官的用处比较多。我们慢慢的说。作用:定义GUIEventHandlers可以请求使用GUI操作系统的动作的抽象接口类。这些动作请求应该遵守用户所使用平台的GUI工具包的规范。例如当一个GUIEventHandler处理一个鼠标事件的时候,它希望去请求GUI,例如当一个模型被’抛出’---(使用TrackballManipulator,按住鼠标右键快速移动,然后松开右键类似抛出物体的动作)时,这个TrackballManipulator可能希望启动计时器,并重复调用,以持续刷新摄像机的位置和方向。但是,它无法做到这一点,因为它对它运行的窗口系统一无所知。得不到任何支持。相反,GUIEventHandler可以通过GUIActionAdapter发出自己的请求,然后使用这个GUI系统的viewer应该遵循这些请求。当然GUIActionAdapter的功能不只是这些,再例如我们上一节也看到了osg::Viewer::View的其中一个基类就是GUIActionAdapter,而osgViewer::View又是osgViewer::Viewer的基类,所以我们可以GUIActionAdapter强转成osgViewer::Viewer.这种使用方式一般也是在处理自定义的EventHandler事件处理器的时候重写handler (const osgGA::GUIActionAdapter &ea ,osgGA::GUIActionAdapter &aa)的时候会用到。

说了两个概念性的东西,有可能比较枯燥,但是技术类工作就是这样,每每在学习一种新的技术或者了解他背后的原理的时候,我们要耐下性子,一步一步来。只有把每一步都搞清楚弄明白我们在能继续前进不至于迷失了方向。

osgViewer::Viewer::isRealized()

我们再此回到我们的解剖课中继续探究osg类物种,osgViewer::ViewerBase::frame()中的下一步就是判读viewer是否已经被实现了,如果没有那么就要实现这个viewer。所以我们要到osgViewer::Viewer::isRealized()函数。主要功能就是这个从这个viewer中得到渲染的上下文,并且判断他们是否被实现。渲染上下文我们应该都很了解,如果您用过qt+osg一定会有这么一个过程,创建一个camera的过程需要指定操作系统的窗口属性,这个渲染的上下文就在这里指定。那我们就去osgViewer::Viewer::getContexts()下看看怎么来得到所有的GraphicsContext()。

osgViewer::Viewer::getContexts()。我们还是老规矩,看看这个新的动作中涉及到那些新的内脏,osg::GraphicsContext。就是图形设备对应的载体,或者说GraphicsContext是任意图形子系统的抽象接口,它提供了统一的图形设备处理函数,用来实现渲染结果和底层设备的交互。图形设备对象的主要工作是提供场景渲染结果的载体,这个载体可以显示缓存,进而绘制到一个图像窗口中,也可以是其他特殊的缓存对象,从而实现复杂的渲染和图像多次曝光等功能,创建一个图像设备不能简单地使用new运算符,因为GraphicContext类是一个不能被实例化的抽象类(这个体现在valid()等一大批纯虚函数上);通常应当使用createContext()静态函数,自动根据当前的用户环境和特性参数traits,构建一个平台相关的图形设备对象。然后绑定到摄相应的像机上。

1
2
3
osg::ref_ptr gc = osg::GraphicsContext::creteGraphicsContext(traits)
 
camera-> setGraphicContext(gc);

所以在osgViewer::Viewer::getContexts()中通过_camera->getGraphicsContext()来得到图形设备对象。

osgViewer::Viewer::getContexts()。我们又遇到了新的不认识的小零件,osg::Slave代表了主相机下的一个跟随相机,以及视图矩阵。我们在前面已经介绍过了osg::View中定义了所有的相机,当场景中只有一个主相机时,那么它即是主导也是场景的渲染器,但是有了从相机,那么主相机将视图控制到场景,而从属相机负责实现场景的渲染。所以osg::Slave中也会包含osg::GraphicsContext,也要中所有的从相机getSlaves()中得到所有的GraphicsContext。并判断他们是否可用GraphicsContexts->vaild()。这样就介绍完了viewer->getContexts().

回到Viewer::isRealized()函数中,再往下就是确定这些得到的所有的图形设备是否已经初始化完成准备被使用。

1
Osg::GraphicsContext::isRealized() const { return isRealizedImplementation();};

也就继承自Osg::GraphicsContext的类或者说Osg::GraphicsContext封装的底层的设备接口类中,这些类一般都在osg::Viewer::api下定义。这些类的仔细介绍我们会稍后进行讲解。这样我们就完成了ViewerBase::frame()一呼一吸动作中的第二个拆解动作isReallized()介绍。

欢迎大家来我的新家看一看3wwang个人博客-记录走过的技术之路

探索未知种族之osg类生物---器官初始化二的更多相关文章

  1. 探索未知种族之osg类生物---器官初始化一

    我们把ViewerBase::frame()比作osg这类生物的肺,首先我们先来大概的看一下‘肺’长什么样子,有哪几部分组成.在这之前得对一些固定的零件进行说明,例如_done代表osg的viewer ...

  2. 探索未知种族之osg类生物---器官初始化四

    上一节我们对完成了对osg生物内部非常重要器官graphicsContext的初始化工作.这样就可保证我们场景中至少有一个graphicContext存在,不至于刚出生就面临夭折.我们根据上一节中os ...

  3. 探索未知种族之osg类生物---器官初始化三

    当判断到viewer中没有一个graphicContext可用时,osg就会默认的进行一次对viewer的实现操作,这样可以保证osg以后可以安心的在屏幕上进行作画.那我们就来看看这个osgViewe ...

  4. 《探索未知种族之osg类生物》目录

    精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...

  5. [转][osg]探索未知种族之osg类生物【目录】

    作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...

  6. 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系

    节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...

  7. 探索未知种族之osg类生物---起源

    任何程序都是有生命的,是生命就需要呼吸.例如普通的windows程序,当运行完main()函数后,就需要进入消息循环,来监听用户的各种操作,以便做出及时的回应.这样的每次循环就像生命的每次呼吸,来维持 ...

  8. 探索未知种族之osg类生物---渲染遍历之器官协作

    好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...

  9. 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...

随机推荐

  1. LDA线性判别分析(转)

    线性判别分析LDA详解 1 Linear Discriminant Analysis    相较于FLD(Fisher Linear Decriminant),LDA假设:1.样本数据服从正态分布,2 ...

  2. Real Time Render 4

    [Real Time Render 4] 1.Radiometry(辐射测试) deals with the measurement of electromagnetic(电磁) radiation( ...

  3. 单元测试框架unittest

    单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...

  4. C#中与C++中的 LPWSTR(wchar_t *) 对应的类型

    1.设置 CharSet = CharSet.Unicode [DllImport("test.dll", EntryPoint = "sum()", Char ...

  5. 数据库类型空间效率探索(三)-char

    测试环境 表信息 表数据量22.23万,占用空间44.494M 用到的sql语句 增加列:alter table t_type add column new_column char(1) defaul ...

  6. 模拟银行业务的JS实现

    /*开户.存款.挂失.补卡.取款.转账.余额查询.密码修改.交易查询.锁定账号.解锁账号等*//*C#第7天 请参考by-Qy*/ using System;using System.Collecti ...

  7. vue中使用全局函数

    方法一: 在mian.js中写入函数: Vue.prototype.bb = function () {        alert('OK'); } 然后在任何组件中都可以调用: this.bb() ...

  8. 全国高校绿色计算大赛 预赛第一阶段(C++)第3关:旋转数组

    挑战任务 在计算机中,一张数字图像,可以被看做是一个矩阵或者说数组. 学过线性代数的同学对矩阵肯定不陌生.一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(r ...

  9. verilog task1

    问题描述: 设计中需要重复多次施加一种激励,每一次激励的施加过程,都可以划分为4个部分,如图所示. 每一次施加的激励只有第二部分的数据有变化(数据格式无变化).所以顶层的Testbench代码如下: ...

  10. jQuery之禁止Get请求缓存

    如果两次Get请求的URL完全一样,则IE浏览器会调用上次缓存的结果,不会发起新的Http请求. 解决办法:在URL最后面加上时间戳. jQuery全局设置禁止缓存 $.ajaxSetup({ cac ...