参考书籍《OpenSceneGraph三维渲染引擎设计与实践》,作者王锐,钱学雷
一、场景图形
1.概念
场景图形(Scene Graph)是一种经常用于计算机游戏和图形学相关软件的数据结构设计方法。
2.应用
典型的应用了场景图形概念的软件系统包括AutoCAD、Java3D、CorelDRAW以及OSG。
3.场景图形实现
简单的场景图形实现是使用数组或者链表,并按照固定的顺序依次绘制或操作这些节点;
大规模场景管理的场景图形往往使用图结构(Graph Structure)或树结构(Tree Structure)来组成一组节点集。
目前多数渲染引擎均采用一种自顶向下、分层的树状结构来组织空间数据集,以提升渲染的效率。
二、三维渲染引擎
1.概念
简单来说,三维渲染引擎就是为了实现三维场景图形的结构管理和绘制而提供的一系列API的集合。它应当包含至少两个层次:构建层(Construction Layer)和交互层(Interaction Layer),前者提供了在三维空间中设计和完成所需模型的工具集,或者从外部加载复杂模型的数据接口;后者则提供对三维空间及所含模型的装配、渲染、优化和控制功能。
2.分类
三维渲染引擎分为低阶引擎和高阶引擎。
(1)低阶引擎
OpenGL和DirectX均为低阶引擎。
(2)高阶引擎
不仅支持面向对象的开发方式,并且以场景图形为基础。
3.主流渲染引擎
PHIGS(Programmer's Hierachical Interactive Graphics System)、OpenInventor、OpenGL Performer、Cystal Space、Java3D、Unreal、OpenSG、OGRE3D、Irrlicht、Vega Prime、OpenSceneGraph
其中,
OGRE3D(Object-Oriented Graphics Rendering Engine)是一个面向场景的、灵活的三维渲染引擎,诞生于1999年,至今其开发团队任然十分活跃。OGRE 3D主要针对游戏开发,可以使用OpenGL或DirectX作为底层支持,并支持多种高级特性。OGRE基于有改动的LGPL协议发布,并实现了场景八叉树、BSP树、CLOD以及分页调度的机制,可以运行于Linux、Mac OS X和Window系统中。
三、OSG
1.概念
OpenSceneGraph是一个高性能开源三维图形引擎,基于修改的LGPL协议(OSGPL)免费发布,广泛应用于虚拟仿真、虚拟现实、科学和工程可视化等领域。它以OpenGL为底层平台,使用C++编写而成,可运行于Windows、UNIX/linux、Mac OS X、IRIX、Solaris、HP-UX、AIX和FreeBSD等操作系统。其功能特性涵盖了大规模场景的分页支持,多线程、多显示的渲染,粒子系统与阴影,各种文件格式的支持,以及对于Java、Perl、Python等语言的封装。
2.优势与不足
OSG引擎由一系列图形学相关的功能模块组成,主要为图形图像应用程序的开发提供场景管理和图形渲染优化的功能。它使用可移植的ANSI C++编写,并使用已成为工业标准为OpenGL底层渲染API。OSG具有跨平台的特性,可以运行在大多数类型的操作系统上,并使用抽象层的概念,使OSG的函数接口可以独立于用户的本地操作系统使用;但是OSG也包含了针对某些平台相关的支持代码。
OSG遵循开源协议发布,其用户许可方式是一种修改过的GNU宽通用公共许可证(GNU Lesser General Public License,LGPL),称为OSGPL。
OSG主要具备以下优势:
(1)快速开发。OSG场景图形内封装了几乎全部的OpenGL底层接口,并随时支持最新的扩展特性。应用程序的开发者可以将中心放在三维程序开发的实质性内容以及与各种场景对象交互的方法上,而不再过多关注底层的代码。
(2)高品质。OSG经历了许多开发成员的反复检查、测试和改善,参与OSG核心代码开发并有贡献的人数很多。
(3)高性能。OSG的核心代码支持多种场景的裁剪技术、细节层次节点、渲染状态排序、顶点数组、显示列表、VBO、PBO、FBO、OpenGL着色器语言等;以及文字显示,粒子系统,阴影系统;雨、雪、火焰、烟雾等特效模拟,场景的东塔调度,线程渲染等各种机制。它们共同使OSG逐渐成为一个高性能的三维渲染引擎。
(4)高质量代码
(5)可扩展性。基于场景图形的扩展思想,OSG提供了强大的可扩展能力,包括各种类型的扩展节点(NodeKits,节点工具箱)、扩展渲染属性、扩展回调、扩展交互事件处理器等,为用户的程序开发提供了灵活的支持能力。
(6)可移植性。OSG提供了Windows、UNIX、Linux、Mac OS X、IRIX、Solaris、HP-UX、AIX和FreeBSD系统的移植能力,基于OSG开发的程序只要经过一次编写,就可以编译并运行在这些平台上,不需要关心更多的代码移植的细节。
(7)低费用。开源意味着免费,使用和发布基于OSG开发的程序和软件是不需要额外许可费用的。
(8)没有知识产权问题。对于开源且易于所有人阅读的代码而言,不存在侵犯软件专利的可能性。
不足:参考文档较少、代码风格不统一、部分功能的实现过于冗杂、无法应用于实践等。
3.组成结构
OSG的功能类采用“命名空间+类名称”的形式来命名。命名空间方式为第一个单词小写,后继单词首字母大写,如osg Util;
类的名称规则采用每个单词首字母大写的组合形式,如MatrixTransform
功能类的成员函数使用小写字母开头,之后每个单词的首字母大写,例setMatrix()
OSG引擎的组成部分包括一系列动态链接库(.dll/so)、插件(.dll/.so)、供开发者使用的静态链接库(.lib/.a)、头文件,以及可执行的工具程序和实例。
按其作用可分为:
OSG核心库:提供了基本场景图形和渲染功能,以及3D图形程序所需的某些特定功能实现。其核心库有:
osg库,osgDB库,osgUtil库,osgGA库,osgViewer库
节点扩展工具箱(NodeKits):扩展了核心OSG场景图形节点类的功能,以提供高级节点类型和渲染特效。节点扩展库包括:
osgAnimation,osgFX,osgManipulator,osgParticle,osgShadow,osgSim,osgTerrain,osgText,osgVolume,osgWidget
OSG文件读写插件:其中包括2D图像、3D模型文件和其他类型文件的读写功能插件,可以任意扩展或删减
内省库:提供了OSG与其他开发环境集成的功能
工具程序和示例集:提供了实用的工具和超过100个有关OSG使用和功能实验的例子
欢迎关注我们的公众号