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


那我们回到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()。

getcontexts

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

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()函数中,再往下就是确定这些得到的所有的图形设备是否已经初始化完成准备被使用。

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

欢迎大家来我的新家看一看 http://www.3wwang.cn

原文地址:https://blog.51cto.com/9302896/2354109

时间: 2024-09-29 19:56:52

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

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

我们把ViewerBase::frame()比作osg这类生物的肺,首先我们先来大概的看一下'肺'长什么样子,有哪几部分组成.在这之前得对一些固定的零件进行说明,例如_done代表osg的viewer是否被删除释放内存:_firstFrame代表是否是第一次进入frame函数.那么接下来我们会发现frame函数表面上组成结构非常简单,逻辑上也非常的清晰---先判断当前的viewer是否被删除,也就是判断是否died,如果已经died,那么肺的功能就不会进行.然后判断这个osg小孩是否刚刚出生,是

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

上一节我们对完成了对osg生物内部非常重要器官graphicsContext的初始化工作.这样就可保证我们场景中至少有一个graphicContext存在,不至于刚出生就面临夭折.我们根据上一节中osg代码的研究也就知道了,在我们正常使用osg时,是怎么完成对camera以及graphicContext的创建的了. 回到Viewer::realize()中我们继续向下看,现在我们对osg::DisplaySettings以及osg::GraphicsContext::WindowingSyste

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

当判断到viewer中没有一个graphicContext可用时,osg就会默认的进行一次对viewer的实现操作,这样可以保证osg以后可以安心的在屏幕上进行作画.那我们就来看看这个osgViewer::Viewer::realize()函数到底具备什么样神奇的功能. osgViewer::Viewer::realize()osgViewer::Viewer::realize()的最要作用可以总结为激活设置窗口以及初始化关联线程.Viewer::getContexts()上一节以及进行了详细的

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

作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的ViewerInit()及realize() 探索未知种族之osg类生物---器官初始化一 探索未知种族之osg类生物---器官初始化二 探索未知种族之osg类生物---器官初始化三 探索未知种族之osg类生物---器官初始化四 ViewBase::frame函数中的advance() 探索未知种族之o

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

节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”RenderBin 所构成的渲染树,进一步了解这两棵树之间错综复杂的关系,以及理解它们与场景节点树之间更加复杂的关系. 上面是一个虚构的场景结构图,其中叶节点_geode3,以及所有六个几何对象均设置了关联的渲染状 态集(StateSet),且几何体 1 和几何体 2 共享了同一个 StateSet(ss11(

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

任何程序都是有生命的,是生命就需要呼吸.例如普通的windows程序,当运行完main()函数后,就需要进入消息循环,来监听用户的各种操作,以便做出及时的回应.这样的每次循环就像生命的每次呼吸,来维持生命体征. osg的程序不仅仅需要消息循环来监听用户的鼠标.键盘等操作,同时也得具备了渲染循环.当然随着我们的对osg的深入了解会发现,osg的事件监听和渲染循环是串行的.但是当我们把osg与MFC(QT)等结合时,相应UI上的鼠标,键盘事件的同时也要兼顾可能发生在osg中的效果,所以一般的osg程

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

好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图(SceneView)的相应实现函数中去完成,渲染器类 Renderer 只是一个更为方便和直观的公用接口而已. 我们总结一下OSG 系统的场景图形,摄像机,图形设备,渲染器和场景视图的关系 OSG 视景器的摄像机(包括主摄像机_camera 和从摄像机组_slaves)均包括了与其对应的渲染器(R

探索未知种族之osg类生物---呼吸分解之advance

回顾我们用了两节的内容才堪堪讲解完ViewerBase::frame()函数中调用的realize()---Viewer:: realize()函数.我们简单的总结就是Viewer:: realize()主要是使GraphicsContext处于可用状态,并且启动相关的图形线程. ViewerBase::frame()函数解读到这里,我们完成了osg生物第一次尝试呼吸所需要的所有器官的初始化工作.下面就真正的开始进入osg呼吸动作的研究了.也就意味着我们真是进入osg的仿真循环的研究当中.那我们

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

事件循环和更新循环**终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateCallback函数,这个就是在更新循环的时候遍历所有的node来调用updateCallback函数的:而事件循环是与用户操作和操作系统事件想关联的,以及调用我们设置的事件回调(EventCallback)函数.而事件循环函数(viewer::eventTraversal())是我们现在要探究的内