场景图形是树状的结构。这种结构可能是最好且最可复用的数据结构之一。树的根节点总是在图形的最顶部,而叶子总是在最底部。对于任一的虚拟世界来说,无论它是2D还是3D的,它都是从一个最顶端的根节点开始。这个虚拟世界随后将延展为节点的层次结构,以表达物体的空间组织,物体的位置设置,物体动画,或者物体之间的逻辑关系(例如交通灯各个状态之间的关系)。图形的叶子节点用于表达物体本身,可绘制的几何体以及它们的材质属性。
场景图形并不是一个游戏或者仿真引擎,尽管它可能是这类引擎的一个主要组成部分;场景图形的主要目的是表达3D世界,并高效地实现场景的渲染。物理模型,碰撞检测和声效则交由用户集成的其它开发库来完成。为什么场景图形没有集成所有这些特性呢?这实际上是正确的选择:它提高了用户程序和工具库之间的互操作性,使得场景图形本身可以用于游戏、虚拟仿真、虚拟现实、科学和商业仿真、军事训练等各个市场的建模工作。
场景图形的优势
图形程序开发者选择场景图形作为开发工具的关键原因有这样几条,性能(Performance),生产力(Productivity),可移植性(Portability),可扩展性(Scalability):
性能 场景图形提供了最大化图形性能的极好框架。好的场景图形系统包含了两项关键技术:场景中无法显示的对象的剔除,以及按照渲染状态(纹理,材质等)进行排序,将相似的对象排列在一起进行渲染。如果不进行剔除的过程,CPU,总线和GPU的工作负荷将升高几倍,而其中很多工作对于表达场景是不必要的。场景图形的层次结构使得剔除工作可以变得非常高效,一座城市的拣选过程也许经过有限的几步就可以完成。而如果不进行按状态排序的话,总线和GPU将随着渲染状态的反复变化而增加负荷,延迟图形管线,损耗绘图效率。随着GPU的速度不断升高,图形管线的延迟消耗也会随之上升,因此场景图形的作用就愈发重要了。
生产力 针对高性能图形程序开发的任务,场景图形已经完成了大量的工作。它负责为用户管理所有的图形信息,并将数以千计的OpenGL指令封装为短短的几行代码。此外,面向对象编程的一个重要概念:对象构成(object composition,在构成设计模式Composite Design Pattern中有叙述),更使得场景图形的树结构变得高度可扩展和可复用——也就是说,场景图形可以适应并解决用户遇到的各类问题。场景图形通常会附带各种工具库,帮助用户设置和管理图形窗口,导入3D模型和图片等。用户因而可以使用较短的代码很好地处理各种事务,我们仅仅使用数行代码就可以加载模型数据并创建一个交互式的视图浏览器。
可移植性 场景图形封装了大量底层的图形渲染和数据读写工作,尽量降低甚至消除用户代码的平台相关性。由于场景图形本身是可移植的,因而在各个平台之间传递和重编译用户程序的源代码也就成了一项很简单的任务。
可扩展性 除了通过对复杂场景的自动动态管理来增强各种机器的图形性能之外,场景图形还负责帮助我们管理各种复杂的硬件配置,例如图形计算机集群,多处理器/多管线系统(SGI Onyx等)。优秀的场景图形可以帮助开发者集中精力于应用程序本身,而场景图形的渲染框架将负责处理各种硬件条件下的底层代码实现。
浏览次数:57943 次