当判断到viewer中没有一个graphicContext可用时,osg就会默认的进行一次对viewer的实现操作,这样可以保证osg以后可以安心的在屏幕上进行作画。那我们就来看看这个osgViewer::Viewer::realize()函数到底具备什么样神奇的功能。
osgViewer::Viewer::realize()
osgViewer::Viewer::realize()的最要作用可以总结为激活设置窗口以及初始化关联线程。Viewer::getContexts()上一节以及进行了详细的介绍,就是得到所有相机上关联的图形设备器。当contexts为空时就代表不存在一个窗口set up,所以osg开启默认一个的视图。读取环境变量OSG_CONFIG_FILE,如果设置了OSG_CONFIG_FILE指向一个.view后缀的文件,可以创建该文件描述的窗口,格式如下:(在openscenegraph-data目录中的configuration目录下有.view类型的文件)
1
2
3
4
|
osgViewer::Viewer { setUpViewInWindow 100 200 600 400 0
} |
如果设置了OSG_CONFIG_FILE环境变量,但是环境变量所对应的文件解析有错,那么整个程序就会退出。
如果没有设置OSG_CONFIG_FILE环境变量,那么程序会检查 OSG_SCREEN和OSG_WINDOW这两个环境变量的值,OSG_SCREEN对应窗口的个数(值是一个整型数)OSG_WINDOW对应窗口的大小和位置,格式是(x, y, w, h) 分别是窗口左上角点坐标(x, y)以及窗口的长和宽(w, h),具体来说是以下情况:
当窗口设置完成之后,osg会再次调用getContexts(contexts) 搜集目前可用的设备渲染上下文,如果这时候还没有窗口产生,也就是说设置窗口的各种方式都失败了,那么程序就会退出,如果成功,那么会针对已经常见的窗口进行一些设置,完成后续的操作
接下来我们先简单的介绍一个表格中三个函数
这些函数调用了osgViewer命名空间中的三个窗口配置类,它们的关系如下图所示:
基类osgViewer::ViewConfig提供了一个虚函数 virtual void configure (osgViewer::View &) const,在子类中通过实现该函数来配置渲染的窗口大小和位置。
这里我们只对一个类的configure函数进行讲解,其他两个请大家自行了解。
AcrossAllScreens::configure(osgViewer::View& view)函数,首先调用osg::GraphicsContext的静态函数getWindowSystemInterface用于获得系统的api接口,至于这个api接口是怎么被创建的,我们需要在src/osg/GraphicsContext.cpp中找到setWindowSytemInterface函数,这里就是进行系统api的设置,他的作用是指定操作平台所使用的视窗 API 接口,也就是在特定的系统平台上创建图形窗口的时候,将会使用到哪些本地 API 函数。当然,Windows 系统要使用 Win32 API,而Linux 系统要使用 X11 API,Apple 系统则使用 Carbon。由于现在实在ubuntu16.04系统上,所以cmake只会把GraphicsWindowX11.cpp进行编译,所以想知道怎么指定的系统api接口在GraphicsContext中,我们需要进入GraphicsWindowX11.cpp的2136行的WindowingSystemInterface 结构体,这个结构体在初始化的时候就会调用。用于设置系统api接口。还 有 注 意 那 个 紧 跟 着 结 构 体 的 全 局 变 量(GraphicsWindowX11.cpp,2159 行),这就是osg设置系统api的基本流程,如果想深入了解,请自行查看。
回到AcrossAllScreens::configure(osgViewer::View& view)函数
osg::DisplaySettings
我们得到了系统api的指针,然后将尝试获取osg::DisplaySettings的指针,它保存了 OSG 目前用到的,与图形显示,尤其是立体显示有关的所有信息,
主要包括:
_displayType:显示器类型,默认为 MONITOR(监视器),此外还支持 POWERWALL(威力墙),REALITY_CENTER(虚拟实境中心)和 HEAD_MOUNTED_DISPLAY(头盔显示器)。
_stereoMode : 立 体 显 示 模 式 , 默 认 为 ANAGLYPHIC ( 互 补 色 ), 此 外 还 支 持QUAD_BUFFER (四方体缓冲), HORIZONTAL_SPLIT (水平分割), VERTICAL_SPLIT (垂直分割),LEFT_EYE(左眼用),RIGHT_EYE(右眼用),HORIZONTAL_INTERLACE(水平交错),VERTICAL_INTERLACE(垂直交错),CHECKERBOARD(棋盘式交错,用于DLP 显示器)。
_eyeSeparation:双眼的物理距离,默认为 0.05。
_screenWidth,_screenHeight:屏幕的实际宽度和高度,分别默认设置为 0.325 和 0.26,
目前它们影响的仅仅是视图采用透视投影时的宽高比。
_screenDistance:人眼到屏幕的距离,默认为 0.5。
_splitStereoHorizontalEyeMapping:默认为 LEFT_EYE_LEFT_VIEWPORT(左眼渲染左视口),也可设为 LEFT_EYE_RIGHT_VIEWPORT(左眼渲染右视口)。
_splitStereoHorizontalSeparation:左视口和右视口之间的距离(像素数),默认为 0。
_splitStereoVerticalEyeMapping:默认为 LEFT_EYE_TOP_VIEWPORT(左眼渲染顶视口),也可设为 LEFT_EYE_BOTTOM_VIEWPORT(左眼渲染底视口)。
_splitStereoVerticalSeparation:顶视口和底视口之间的距离(像素数),默认为 0。
_splitStereoAutoAdjustAspectRatio:默认为 true,用于屏幕分割之后对其宽高比进行补偿。
_maxNumOfGraphicsContexts:用户程序中最多可用的 GraphicsContext(图形设备上下文)数目,默认为 32 个。
_numMultiSamples:多重采样的子像素样本数,默认为 0。如果显示卡支持的话,打开多重采样可以大幅改善反走样(anti-aliasing)的效果。此外还有很多可以设置的类变量,如_minimumNumberStencilBits(模板缓存的最小位数)等,其默认设置均在 osg::DisplaySettings::setDefaults 函数中完成,其中有些变量可能还没有作用。要注意的是,DisplaySettings 的作用仅仅是保存所有可能在系统显示中用到的数据,这个类本身并不会据此改变任何系统设置和渲染方式。
再此回到AcrossAllScreens::configure(osgViewer::View& view)函数,我们上一节总结了一下osg::DisplaySettings的作用,我们继续看看配置一个osg内置的screen需要哪些设置。通过相机得到视椎体的一些信息(包含:fovy俯仰角,aspectRatio纵横比,zNear近平面, zFar远平面,其中这里用到的属性是aspectRatio,主要是用来确定当osg默认的与图形设备中设置的screen数目的相同的从相机中每一个从相机的视口的大小)。然后再通过ScreenIdentifier平面初始化器得到screenNum,displayNum,hostName的值。其中如果screenNum或displayNum未定义则设定为-1,这三个变量的最主要的作用是给GraphicsContext中的某些属性赋值。当displayNum的值是1,也就相当于创建一个SingleScreen,所以直接可以调用昨天提到的SingleScreen的configure函数,创建一个单独的屏幕来渲染三维世界就可以了,但是当displayNum的值大于1时,就需要用到分屏技术,通过创建多个从相机,来得到场景中的某一部分的视图,最后拼接成一个大的三维场景的方式。所以else(src\osgViewer\config\AcrossAllScreens.cpp\ AcrossAllScreens::configure 函数的第50行之后都是在创建多个GraphicsContext并付给相应的从相机。)
这样我们就介绍完了osg创建一种AcrossAllScreens的方式。
欢迎大家来我的新家看一看 3wwang个人博客-记录走过的技术之路
相关推荐
截止到2020/03/10最新版本的osg和osgEarth开发库,osg版本为3.6.4,osgEarth版本为2.10.2,之前编译了VS2017版本的开发库,有网友反映需要32位的开发库,当时确实没时间专门编译32位的开发库,最近正好有个项目需要...
通过运行和分析这些程序,开发者可以学习如何初始化场景图,加载地理数据,创建交互式界面,以及如何利用osgEarth进行复杂的地球建模和可视化。 总结来说,"osg3.4-osgearth2.8-2015-x64.7z" 包含了OpenSceneGraph ...
【osg-windows-binaries-master.zip】是一个包含osg285版本的OpenSceneGraph(简称OSG)库的压缩包,特别针对Windows平台进行了优化。OpenSceneGraph是一个开源的高性能图形库,广泛用于3D图形应用程序开发,如游戏...
3. 构造函数:初始化同心球的参数。 4. 更新方法:可能包含更新球体位置、大小或颜色的函数,以便动态改变同心球的外观。 5. 绘制方法:覆盖`draw()`或`accept()`函数,以绘制同心球,可能涉及到OpenGL的绘制命令。 ...
【osg-data-master.zip】是一个包含osgEarth相关数据的压缩包,这个名字暗示了它与开源图形库OpenSceneGraph(OSG)的扩展模块osgEarth有关。OpenSceneGraph是一个强大的3D图形编程库,主要用C++编写,广泛应用于...
《OSG2CesiumApp-V1.10:将倾斜摄影osgb数据转换为3DTiles的实用工具》 在现代地理信息系统(GIS)和虚拟现实应用中,3DTiles是一种广泛采用的数据格式,它允许高效地在Web浏览器中加载和展示大规模三维地形和建筑...
《gwaldron-osgearth-osgearth-2.8-0-g449e80a:探索OSGEarth的2.8.0版本》 在IT领域,尤其是在三维地理信息系统(GIS)的世界中,osgEarth是一个备受瞩目的开源项目。这个名为“gwaldron-osgearth-osgearth-2.8-0-...
osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,TMS,VPB,filesystem等),再结合一套地理投影转换插件...
编译osgearth-osgearth-2.5所需要的依赖包 包括以下资源: 3rdParty_VC10_x86_x64.zip curl-7.25.0.zip expat-win32bin-2.0.1.rar gdal181.zip geos-3.2.3.tar.bz2 libzip(vs10).rar OpenSceneGraph-3.0.1.zip ...
osgEarth是一个开源的、基于OpenGL的地理可视化库,用于在3D场景中展示地球数据。接着,“2.7”是版本号,这通常意味着这是一个软件或库的特定稳定版本。最后,“0-g25ce0e1”可能是Git的提交哈希值,它标识了该版本...
1、OSGEarth2.10源码预编译好的二进制开发包(64位) 2、基于OSG3.6.5版本 3、基于Visual Studio2019编译的64位版本
这里会包含对osg库的引用和初始化,以及3D场景的创建和管理。 3. 实现3D图形渲染:在C++/CLI代码中,使用osg库创建和设置3D模型,设置光照、材质等参数,然后在指定的窗口句柄(Hwnd)上绘制3D场景。 4. 更新和同步...
截止到2020/03/10最新版本的osg和osgEarth开发库,osg版本为3.6.4,osgEarth版本为2.10.2,之前编译了VS2017版本的开发库,有网友反映需要32位的开发库,当时确实没时间专门编译32位的开发库,最近正好有个项目需要...
在网上看了很多个版本的编译库,感觉不是很符合需求,有些库太老,有些依赖库版本不一致,我特意根据osg3.6.5和gdal3.0.4编译了VS2019版本的osgearth3.1,O基于GL2版本,适用性较强,亲测可用,无异常,同时提交了...
《osgearth:构建3D地理可视化应用的开源框架》 osgEarth是一个基于OpenSceneGraph(osg)的开源库,用于创建交互式的3D地球应用程序。它提供了丰富的功能,包括地形渲染、遥感图像处理、GPS数据集成以及各种地理...
生成的模型通常是以osgb或其他格式存储的,而这个转换工具可以帮助用户将模型适应不同的分析、可视化或展示需求。 转换过程中,可能会涉及到纹理映射、法线、UV坐标等的处理,工具应该能够正确地处理这些细节,以...
1. **三维几何处理**:osg支持多种几何对象的创建、编辑和渲染,如点、线、面、多边形等,并提供了强大的几何操作函数。 2. **纹理和材质管理**:osg可以加载和管理各种纹理,包括2D、3D、立方体纹理等,同时支持...
在`OSG-Dragger-Dragger.pdf`文档中,读者可以期待找到更多关于`osg::Dragger`类的详细信息,包括如何创建和使用自定义的Dragger,以及如何结合`PointInfo`进行更复杂的交互设计。这份资料将帮助开发者深入理解如何...
【标题】"osg-water-reflect.rar" 是一个基于OpenSceneGraph (osg) 开发的程序,专注于实现水面的反射效果。"osg ocean" 暗示这个程序可能包含对海洋或者大面积水域的模拟,而 "osg reflect" 则强调了其中的反射功能...
OSGEARTH是一个开源的地球可视化库,它基于OpenSceneGraph(OSG)构建,用于创建交互式的3D地球应用程序。OSGEarth 2.3版本是这个项目的其中一个稳定发行版,提供了许多增强的功能和改进。在了解这个压缩包的内容...