- OSG使用组节点来组织和排列场景中的几何体
- 一个场景中多个对象(组节点或节点),一个对象下可能包含多个对象(组节点或节点),所有的节点类都有一个共有的基类,同时各自派生出实现特定功能的方法。
- 大量定义的节点类型及其内含的空间组织结构能力,使得传统的底层渲染API 无法实现的数据存储特性得到了实现。
- OpenGL和Direct3D 主要致力于图形,尽管图形设备可以暂时保存即将执行的几何和状态数据(例如显示列表和缓冲对象),但是底层 API 中对于上述数据的空间组织能力在本质上还是显得过于简单和弱小,往往难以适应大部分 3D 程序的开发与应用需求。
- 如OpenGL就是面向过程的基础实现,简单的变换各种图元贴图都需要自己开发,图元一多需要自己组织,而OSG提供了类似于Qt场景的组织和控制能力。
- 场景图形除了提供底层渲染API中具备的几何信息和状态管理功能外,还附加了以下特性:
- 控件结构:场景图形所采用的树状数据结构更容易让人理解,符合人的惯性思维。
- 场景拣选:使用本地 CPU 的投影剔除(frustum culling)和隐藏面剔除(occlusion culling)来减少系统总体负担,其基本原理是,在最终渲染图像时忽略对不会显示的几何体的处理。
- 细节层次(LOD):使用几何体包围盒计算观察者与物体的距离,使得用户可以更高效地渲染处于不同细节层次上的物体。并且,实时的,场景中进入指定观察距离的那部分对象将从磁盘中载入,而它们一旦超出这一距离时,将从内存中被移除。
- 透明:要实现透明或半透明几何体的正确和高效的渲染,需要首先渲染所有不透明的几何体,再渲染透明几何体。而且,透明几何体必须按照深度排序并按照“从后向前”的顺序渲染。场景图形一般都会提供上述这些操作。
- 状态改动最少化:为了最大限度地提升程序性能,应该避免冗余和不必要的状态改变。场景图形会按状态对几何体进行排序以最小化状态改动, OpenSceneGraph 的状态管理工具则负责消除冗余的状态改变。
- 文件 I/O:场景图形可以高效地读写磁盘上的 3D 数据集。在将数据读入内存之后,应用程序可以方便地通过内建的场景图形数据结构操控动态3D 数据。场景图形也是一个高效的文件格式转换工具。
- 更多高性能函数:除了底层 API 提供的基础函数之外,场景图形库还提供了高效能的功能函数,例如全特性的文字支持,渲染特效的支持(例如粒子特效,阴影),渲染优化, 3D 模型文件读写的支持,并支持对跨平台的输入、渲染及显示设备的访问。
- 几乎所有的 3D 程序都需要其中的部分特性。因此,直接使用底层 API 来构建程序的开发者不得不自行在程序中实现其中的某些性能, 从而增加了研发的时间、人力及资金投入。使用现有的、支持上述特性的场景图形库,将有助于实现快速的程序开发工作。
- 命名空间: OSG 的域名空间使用小写字母开头,然后可以使用大写字母以避免混淆(驼峰)。例如,osg,osgSim,osgFX 等。
- 类:OSG 的类名以大写字母开头,如果类的名称是多个单词的组合,此后每个单词的首字母大写。例如,MatrixTransform,NodeVisitor,Optimizer。
- 类方法:OSG类的方法名使用小写字母开头,如果方法的名称是多个单词的组合,此后每个单词的首字母大写。例如,addDrawable(),getNumChildren(),setAttributeAndModes()。
- 类成员变量:类的成员变量命名与方法命名的方式相同。
- 模板:OSG模板的命名用小写字母,多个单词之间使用下划线分隔。例如, ref_ptr< >,graph_array< >,observer_ptr< >。
- 静态量:静态变量和函数的名称使用 s_开头,此后的命名与类成员变量及函数的命名方法相同。例如, s_applicationUsage,s_ArrayNames()。
- 全局量:全局类的实例命名用g_开头。例如,g_NotifyLevel,g_readerWriter_BMP_Proxy。
- OSG 运行时文件由一系列动态链接库(或共享对象)和可执行文件组成。这些链接库可分为以下五大类:
- OSG 核心库。它提供了基本的场景图形和渲染功能,以及 3D 图形程序所需的某些特定功能实现。
- NodeKits。它扩展了核心 OSG 场景图形节点类的功能,以提供高级节点类型和渲染特效。
- OSG 插件。其中包括了 2D 图像和 3D 模型文件的读写功能库。
- 互操作库。 它使得 OSG 易于与其它开发环境集成, 例如脚本语言 Python和 Lua。
- 不断扩展中的程序和示例集。 它提供了实用的功能函数和正确使用 OSG的例子。
- OSG 核心库提供了用于场景图形操作的核心场景图形功能、类和方法;开发3D图形程序所需的某些特定功能函数和编程接口; 以及2D和3D文件I/O的OSG 插件入口。 OSG 核心库包含了以下四个链接库:
- osg库:osg库包含了用于构建场景图形的场景图形节点类,用作向量和矩阵运算的类,几何体类,以及用于描述和管理渲染状态的类,还包括了3D图形程序所需的典型功能类,例如命令行参数解析,动画路径管理,以及错误和警告信息类。
- osgUtil库:osg工具库包括的类和函数,可以用于场景图形及其内容的操作,场景图形数据统计和优化,以及渲染器的创建,还包括了几何操作的类,例如 Delaunay 三角面片化(Delaunay triangulation),三角面片条带化(triangle stripification),纹理坐标生成等。
- osgDB 库:此链接库包括了建立和渲染 3D 数据库的类与函数。其中包括用于 2D 和 3D 文件读写的 OSG 插件类的注册表,以及用于访问这些插件的特定功能类。 osgDB 数据库分页机(database pager)可以支持大型数据段的动态读入和卸载。
- osgViewer 库:这个库是 OSG 的 2.0 版本新增的,它包含了场景中视口及可视化内容的管理类。 osgViewer 已将 OSG 集成到多种多样的视窗系统中。
- 场景图形类:用于辅助场景图形的构建
序号 | 类名 | 所属库 | 描述 |
---|---|---|---|
1 | Node | osg | 所有场景图形中所有节点得基类,它包含了用于长图形的遍历、拣选、程序回调,以及状态管理的放法 |
2 | Group | osg | 所有可分支节点的基类,它是场景图形控件组织结构的关键类 |
3 | Geode | osg | OSG中的叶节点,没有子节点,包含了osg::Drawable对象,而osg::Drawable对象中存放了将要被渲染的几何体 |
4 | LOD | osg | 根据观察点与图像子节点的距离选择显示子节点,通常用使用它来创建场景中物体的多个显示层级 |
5 | MatrixTransform | osg | 包含了用于实施子节点几何体控件转换的矩阵以实现场景对图像的旋转、平移、缩放、倾斜、映射等操作 |
6 | Switch | osg | 用布尔掩板来允许或禁止子节点的运作 |
序号 | 类名 | 所属库 | 描述 |
---|---|---|---|
1 | Drawable | osg | 用于存储几何数据信息的基类,Geode维护了一个Drawable的列表。Drawable是纯虚羸,无法直接实例化 |
2 | Geometry | osg | Geometry 类与 PrimitiveSet 类相关联,实现了对 OpenGL 顶点数组功能的高级封装。 Geometry 保存顶点数组的数据,纹理坐标,颜色,以及法线数组 |
3 | PrimitiveSet | osg | PrimitiveSet 类提供了 OpenGL 顶点数组绘图命令的高层次支持。用户可以从相关的 Geometry 类中取得保存的数据,再使用这个类来指定要绘制的几何体数据的类型 |
4 | Vector | osg | OSG 提供了预定义好的二维,三维和四维元素向量,支持 float 或者 double 类型。使用这些向量来指定顶点、颜色、法线和纹理坐标的信息 |
5 | Array | osg | OSG 定义了一些常用的数组类型,如用于贴图纹理坐标的 Vec2Array。指定顶点数组数据时,程序首先将几何数据保存到这些数组中,然后传递至 Geometry 类对象 |