OSG入门_场景图形与OpenSceneGraph概述00

简单整理入门笔记,内容包括:
1.场景图形与OpenSceneGraph概述;
2.建立一个场景图形:内存管理、叶节点和组节点、渲染状态、文件I/O、NodeKit与osgText;
3.在程序中使用OpenSceneGrpah:渲染、动态更改;

OpenScenceGraph图形系统是基于OpenGL的软件接口,可以高效率的开发交互式图形系统。它使用可移植ANSI C++编写。它是由很多开源的图形库组成,提供了不同的功能模块,一个简单的基于OSG的程序往往需使用osgViewer、osgDB、osgUtil和osg库。

场景图形概述

OSG场景特性

场景图形除了提供底层渲染API中具备的几何信息和状态管理功能之外,还兼备如下的附加特性和功能:

1.空间结构

场景图形采用的树状数据结构更直观,也更符合人们一般理解中的空间事物的排布和组织结构。

2.场景拣选

使用本地CPU的投影剔除(frustum culling)和隐藏面剔除(occlusion culling)来减少系统总体负担,其基本原理是,在最终渲染图像时忽略对不会显示的几何体的处理。

3.细节层次

使用几何体包围盒计算观测者与物体的距离,使得用户可以更高效地渲染处于不同细节层次上的物体。并且实时的,场景中进入指定观察距离的那部分对象将从磁盘中载入,而它们一旦超出这一距离时,将从内存中被移除。

4.透明

要实现透明或半透明几何体的正确和高效的渲染,需要首先渲染所有不透明的几何体,再渲染透明几何体。而且,透明几何体必须按照深度排序并按照“从后向前”的顺序渲染。场景图形一般都会提供上述这些操作。

5.状态改动最少化

为了最大限度地提升程序性能,应该避免冗余和不必要的状态改变。场景图形会按状态几何体进行排序以最小化状态改动,OpenScenceGraph的状态管理工具则负责消除冗余的状态改变。

6.文件I/O

场景图形可以高效地读写磁盘上的3D数据集。在将数据读入内存之后,应用程序可以方便地通过内建的场景图形数据结构操控动态3D数据。场景图形也是一个高效的文件格式转换工具。

7.更多高性能函数

除了底层API提供的基础函数之外,场景图形库还提供了高效能的功能函数,例如全特性的文字支持,渲染特效的支持(例如粒子特效、阴影),渲染优化,3D模型文件读写的支持,并支持对跨平台的输入、渲染及显示设备的访问

场景图形渲染方式

为了实现动态的几何体更新,拣选,排序和高效渲染,有三种需要遍历的操作:
更新:更新遍历(程序遍历)允许程序修改场景图形,以实现动态场景。更新操作由程序或者场景图形中节点对应的回调函数完成。例如,在飞行模拟系统中,程序可以使用更新遍历来改变一个飞行器的位置,或者通过输入设备来实现与用户的交互。
拣选:在拣选遍历中,场景图形库检查场景里所有节点的包围体。如果一个叶节点在视口内,场景图形库将在最终的渲染列表中添加该节点的一个引用。此列表按照不透明体与透明体的方式排序,透明体还要按照深度再次排序。
绘制:在绘制遍历中(渲染遍历),场景图形将遍历由拣选遍历过程生成的几何体列表,并调用底层API,实现几何体的渲染。

特别地,这种遍历操作在每一个渲染帧中只会执行一次。但是,有些渲染特例需要将同一个场景(不同或相同部分)在多个视口中进行同步显示,例如立体化渲染和多屏显系统的实现。这种情况下,每一帧的更新遍历将只会执行一次,但拣选和绘制遍历在每个视口内均执行一次(对于简单的立体化渲染,每帧执行两次;对于多屏显系统,每块显示每帧执行一次)。这样多处理器和多显卡的系统就可以实现并行场景图形处理。其中,拣选遍历必须为只读操作以允许多线程下的数据访问。

OSG组件

OSG运行时文件由一系列动态链接库和可执行文件组成。这些链接库可分为以下五大类:
OSG核心库 基本的场景图形和渲染功能。
NodeKits 扩展OSG场景图形节点类的功能,以提供高级节点类型和渲染特性。
OSG插件 包括2D图像和3D模型文件的读写功能库。
互操作库 使OSG易于与其它开发环境集成
不断扩展中的程序和示例集 功能函数和使用OSG例子

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 集成到多种多样的视窗系统中。

OSG核心库之链接库

OSG链接库之场景图形类
OSG中所有的场景图形类都继承自OSG::Node,OSG中的根节点并不是特定的节点类型,它仅仅是一个没有父类的osg::Node类。
Node:Node类是场景图形中所有节点的基类。它包含了用于场景图形遍历、拣选、程序回调以及状态管理的办法。

Group:Group类时所有可分支节点的基类。它是场景图形空间组织结构的关键类。

Geode:Geode类相当于OSG中的叶节点。它没有子节点,但是包含了osg::Drawable对象,而osg::Drawable对象中存放了将要被渲染的几何体。

LOD:LOD类根据观察点与图像子节点的距离显示子节点。通常使用它来创建场景中物体的多个显示层级。

MatrixTransform:MatrixTransform 类包含了用于实施子节点几何体空间转换的矩阵,以实现场景对象的旋转、平移、缩放、倾斜、映射等操作。

Switch:Switch 类用布尔掩板来允许或禁止子节点的运作。
OSG链接库之几何体类
Geode类是OSG的叶节点,它包含了渲染用的几何数据。使用以下列出的类可以实现Geode中几何数据的存储。

Drawable:Drawable类时用于存储几何数据信息的基类,Geode维护了一个Drawable的列表。Drawable是纯虚类,无法直接实例化。用户必须实例化其派生类,如Geometry或者ShapeDrawable(允许用户程序绘制预定义的几何形状,如球体、圆锥体和长方体)

Geometry:Geometry类与PrimitiveSet类相关联,实现了对OpenGL顶点数据功能的高级封装,Geometry保存顶点数据的数据,纹理坐标,颜色以及法线数组。

PrimitiveSet:Primitive类提供了OpenGL顶点数组绘图的高层次支持,用户可以从相关的Geometry类中取得保存的数据,再使用这个类来指定要绘制的几何体数据的类型。

Vector类(Vec2,Vec3等):OSG提供了预定义好的二维,三维和四维元素向量,支持float或者double类型。使用这些向量来指定顶点、颜色、法线和纹理坐标的信息。

Array类(Vec2Array,Vec3Array等):OSG定义了一些常用的数组类型。如用于贴图纹理坐标的Vec2Array。指定顶点数组数据时,程序首先将几何数据从保存到这些数组中,然后传递至Geometry类对象。
OSG链接库之状态管理类
OSG 提供了一种机制,用以保存场景图形所需的OpenGL 渲染状态。在拣选遍历中,同一状态的几何体将被组合集中到一起以使状态的改变呈最小化。在绘制遍历中,状态管理代码将记录当前状态的历史轨迹,以清除冗余的渲染状态变更。

状态集合(StateSet):OSG 在StateSet 类中保存一组定义状态数据(模式和属性)。场景图形中的任何osg::Node 都可以与一个StateSet 相关联。

模式(Modes):与OpenGL 的函数glEnable()和glDisable()相似,模式用于打开或关闭OpenGL 固定功能(fixed-function)的渲染管道,例如灯光,混合和雾效。方法osg::StateSet::setMode()在StateSet 中保存一个模式信息。

属性(Attributes):应用程序使用属性来指定状态参数,例如混和函数,材质属性,雾颜色等。方法osg::StateSet::setAttribute()在StateSet 中保存属性信息。

纹理模式和属性:纹理模式和属性可应用在OpenGL 多重纹理的某个指定纹理单元上。应用程序必须在设定纹理模式和属性时提供纹理单元的信息,注意,和OpenGL 不同,OSG 不存在缺省的纹理单元。StateSet类的方法setTextureMode()和setTextureAttribute()用于设定状态参量以及纹理单元信息。

继承标志:OSG 提供了一些标志量,用于控制场景图形遍历中的状态值。缺省情况下,子节点中的状态集合将重载父节点的状态集合,但是也可以强制父节点的状态重载子节点的状态,或者指定子节点的状态受到保护而不会被其父节点重载。
OSG链接库之其它实用类(OSG 的内存引用计数策略)
Referenced:Referenced 类是所有场景图形节点和OSG 的许多其它对象的基类。它实现了一个用于跟踪内存使用情况的引用计数(reference count)。如果某个继承自Referenced 的对象,其引用计数的数值到达0,那么系统将自动调用其析构函数并清理为此对象分配的内存。

ref_ptr<>:模板类ref_ptr<>为其模板内容定义了一个智能指针,模板内容必须继承自Referenced 类(或提供一个与之相同的、能实现引用计数的接口)。当对象的地址分配给ref_ptr<>时,对象的引用计数将自动增加。同样,清除或者删去ref_ptr 时,对象的引用计数将自动减少。

Object:纯虚类Object 是OSG 中一切需要I/O 支持,拷贝和引用计数的对象的基类。所有的节点类,以及某些OSG 对象均派生自Object 类。

Notify:osg 库提供了一系列控制调试,警告和错误输出的函数。用户可以通过指定一个来自NotifySeverity 枚举量的数值,设定输出的信息量。OSG 中的大部分代码模块执行时都会显示相关的信息。

OSG入门基础_00 01 02概况图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tingzhushaohua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值