简单整理入门笔记,内容包括:
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概况图:

OSG入门_场景图形与OpenSceneGraph概述00相关推荐

  1. 第一次运行OSG入门程序失败记和搞定的情况

    一 OSG简介 OpenSceneGraph(简称OSG)使用OpenGL技术开发,是一套基于C++平台的应用程序接口(API),它让程序员能够更加快速.便捷地创建高性能.跨平台的交互式图形程序.它作 ...

  2. iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门

    iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 文章目录 iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 PDF报表入门 3 ...

  3. 游戏开发入门(一)游戏开发概述

    视频链接:游戏开发入门(一)游戏开发概述(3节课 时常:约1小时03分钟) 该视频围绕电子游戏的发展与开发简单介绍了一些基本常识,同时提出并解决了几个问题 笔记与总结(请先学习视频内容): 1.游戏机 ...

  4. 【100天精通python】Day1:python入门_初识python,搭建python环境,运行第一个python小程序

    目录 专栏导读 1 初始python python 概述 python的应用领域 应用python的公司 2 搭建python 开发环境 2.1 安装python(以windows 系统为例)(1)下 ...

  5. 计算机软件专业入门,类图入门_计算机软件及应用_IT计算机_专业资料

    类图入门_计算机软件及应用_IT计算机_专业资料 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 类图和对象图教程■类(Class )& ...

  6. notes-JavaScript-JavaScript极速入门_玉女心经系列 网址:http://www.php.cn

    JavaScript极速入门_玉女心经系列 网址:http://www.php.cn 第1章 JAVASCRIPT基本概念(极速入门) 1-1 JavaScript概述 1-2 JavaScript引 ...

  7. seaborn从入门到精通02-绘图功能概述

    seaborn从入门到精通02-绘图功能概述 总结 参考 A high-level API for statistical graphics 用于统计图形的高级API Similar function ...

  8. JAVA入门_多线程_邮局派发信件

    JAVA入门_多线程_邮局派发信件 Postman package cn.campsg.java.experiment.entity;public class Postman {private Str ...

  9. scrapy 的三个入门应用场景

    说明: 本文参照了官网的 dmoz 爬虫例子. 不过这个例子有些年头了,而 dmoz.org 的网页结构已经不同以前.所以我对xpath也相应地进行了修改. 概要: 本文提出了scrapy 的三个入门 ...

最新文章

  1. 吃了这些数据集和模型,跟 AI 学跳舞,做 TensorFlowBoys
  2. winform 系统托盘程序
  3. Java网络编程之IP地址和InetAddress类
  4. QML基础类型之georectangle
  5. 绝!关于pip的15个使用小技巧
  6. 剑网三缘起,签到领奖活动还能获得白猫,满级玩家5天就得跟宠
  7. linux tr命令完整,linux tr命令详解
  8. ROS服务中存在string类型变量,如何给string类型变量赋值及取值
  9. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]...
  10. 利用ISA实现网站发布协议重定向
  11. memcached(五)--源码分析,启动
  12. 对路径“C:\Program Files (x86)\gwssi\CPC客户端\CheckWord.xml”的访问被拒绝。
  13. php laravel 中文手册,Laravel 5.6 中文离线手册文档(兼容5.5)(PDF版)
  14. 常见电平信号、RS232与RS485相关知识总结
  15. 利用微信官方文档下载微信对账单、资金账单
  16. Beta冲刺第二周王者荣耀交流协会第五次会议
  17. python贝叶斯算法的论文_3个范例带你读懂贝叶斯法则
  18. JAVA的简单数据类型和复合数据类型
  19. 塞班s60v3手电筒sisx_塞班s60v3闪光灯手电筒软件可以发给我吗?谢谢!
  20. java动态规划货车运输,题解 P1967 【货车运输】

热门文章

  1. html中加上边框的语句有哪些,如何将文字放在边框上? (HTML,CSS)
  2. Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)
  3. 首届CIO智库周年庆顺利召开
  4. 十种常见的web攻击
  5. 特技摩托前线android安装_特技摩托前线安卓版下载_特技摩托前线手游下载v3.8.0_3DM手游...
  6. pcb板表面处理:喷锡和沉金
  7. VxWorks调试记录
  8. vxworks和linux双系统,vxworks和dos双启动
  9. border-radius(CSS3属性)
  10. “唐山(交大)精神”赞