第一部分 简 介
引 言
室外场景的实时渲染技术是游戏编程世界中的热点技术. 同时它在其它领域也有着同样重要的作用。如 GIS 系统,飞行模拟系统,VR系统以及数字地球技术等都离不开室外场景的实时渲染技术。一个优秀的室外场景实时渲染技术在保证实时性以外还能创造出非常逼真的、有说服力的虚拟自然环境。如Nova Logic公司的著名的3D射击游戏Delta Force 系列,它除了能模拟出各种如雪地、草地、沙漠等地形以外,还能模拟出各种树木,杂草,以及各种天气效果。
室外场景的实时渲染有许多技术上的难点,在以下的章节里我们将作详细的介绍以及针对一些主要问题的解决方案。
本文的主要内容分两个部分:一、大规模地形的渲染。二、如何提高场景的真实性。分别第二部分和第三部分。
3D场景的渲染离不开3D API。目前流行的3D API有两种,SGI公司的OpenGL和微软公司的Direct3D。两种API各自有自己的优点,均能很好的使用硬件加速功能。但是OpenGL是一种开放性的标准,有更好的移植性能,它能在Linux 和FreeBSD 下工作。甚至还可以使用硬件加速(nVidia公司专门为Linux /FreeBSD推出了驱动程序)。因此在本文里,我使用了OpenGL。不过如果熟悉原理,其实也大同小异,D3D到8.0以后做的非常的像OpenGL.
第一章:大规模室外场景渲染技术简介
一.室外 Vs. 室内
下面我们把室内场景和室外场景做一个对比,来看看室外场景的实时渲染的主要难点。
目前最成功的商业室内游戏引擎有Quake /DOOM系列、Unreal系列引擎。他们都基于BSP技术的。通过BSP技术,再加上PVS , Portal等技术可以大量减少场景的复杂程度,通过Portal技术甚至可以把一个室内场景和一个室外场景连接起来,关于室内引擎的渲染的进一步已经超出了本文的范围。
我们知道,当我们站在一个房间里的时候,我们能欣赏到的景物不过是这个房间的摆设以及透过这个房间的门和窗能看到的景物而已。你只能在墙壁的约束范围内走动。换句话说,我们处在一个有限的空间内。我们有足够的理由阻止人们穿过墙进入墙外的世界,也有足够的理由把视野约束在高墙以内。
图(1-1)
一个典型的室内场景,使用id Software的Quake III地图文件,用www.GameToturials.net 的程序渲染
但是,这些约束在一个室外的场景中都是不可能的。在一个飞行模拟器中,理论上你可以驾驶飞机朝任何一个无限远的飞去。因为事实也是如此,如果你愿意的话,你可以驾驶飞机绕着地球飞行而不用担心有墙来阻止你的前进。换句话说,一个室外场景的理想大小是无限的大!除了场景的大小以外,同时视野也是无限的。如果你站在高处,你可以俯视任何比你的底的地方,也就是说你有几乎无限的视野。
图(1-2)
典型室外场景,图片来自北航王正盛的Demo :Nature Wing2.0截图
我们知道,无限的大的场景需要无限的场景数据。但是这是不可能的,我们只能希望场景越大越好,室外场景的主要部分是地形的渲染,地形数据的多少决定了场景的大小。所以如何保存这些地形数据成了首要的问题。(但是在现在存储器成本迅速下降的今天,这个问题已经变的不是十分的突出。)其次是无限的视野问题,无限的视野就表示渲染无限的图元(图元即是3DAPI支持的简单的几何图形,详见OpenGL/Direct3D SDK),这也是不可能。图元的数量是以场景大小的平方的速度增长的。光考虑地形数据,一个2048X2048的地形,如果不考虑减低细节程度和裁剪的话,它将要渲染8M的三角形,这样的三角形量在PC级别上目前还是远不能实现交互式帧率的。所以,如何减少要渲染地形时候的图元数目成了室外场景实时渲染的关键问题。
其他的情况还有如野外的地表衍生物:树木、杂草、地貌等。同时天气效果,如下雨、下雪,刮风和闪电等.这些东西在一个室内的环境下基本上是不需要考虑的。而且模拟这些效果都需要很高的代价,有些甚至根本就没有办法模拟。
二.Voxel Vs LOD
综上,我们知道,室外场景实时性渲染的关键地形的渲染。我们需要一种技术来降低地形渲染的开销。
目前的地形渲染技术主要有两种Voxel和LOD,下面我来做个简单的介绍。
Voxel 也就是Volumetric Pixel。也就是所谓的“体素”,它是相对于像素来说的,如果说像素是一个二维的矩形的话,那么Voxel就是一个三维的立方体。它的原理是比较简单的。James Sharman自称他在1995年时就想出了这种方法。前面的提到的Delta Force游戏就是使用了Voxel 技术。关于Voxel的细节技术不是本文的重点,我不准备做深入的介绍。Voxel有一个天生的优点就是渲染的时候它和场景的大小没有关系,而且绝对不会渲染多余的东西(自带裁剪功能)。它的复杂度只和我们需要的视野,以及分辨率有关。而且可以在不使用硬件加速的情况下达到比较理想的速度(Delta Force I就没有使用硬件加速),生成的图象也比较的细腻。它的缺点就是不够的灵活。
LOD 也就是层次细节(Level of Detail)的简称,不同于Voxel技术,它是一种使用多边形的,真正的 3D渲染技术。它根据一定的规则来简化物体的细节,我们可以根据需要来选择不同细节程度的物体表达方式。如离观察者近的选择较高的细节程度、反之选择较底的细节程度。用在地形渲染中,有时我们也称它为多分辨率地形(Muti-resolution terrain)渲染技术。
图(1-3)
基于Voxel的渲染场景,图片来自中国游戏开发者网络,陈鹏《自己动手编Voxel 3D引擎》
图(1-4)
基于LOD的渲染结果,图片来自本文的Demo: Sim-Nature.
LOD算法处理起来比较复杂,但是它让我们可以足够自由的去控制我们的场景渲染,更加方便的使用显卡的硬件加速功能。而且可以很容易的在场景中组合其他的物体。如树木,太阳以及粒子系统等,天空如它可以方便的让观察者以任意的角度去观察场景,我们只要让摄影机旋转一定的角度就可以了。但是这在Voxel中是比较困难的,因为Voxel在处理非水平的视线的时候非常的麻烦。
LOD技术是本文将要使用和实现的地形渲染技术。
图(1-5)
经过LOD处理的地形网格,有不同的细节。图片来自本文的Demo: Sim-Nature.
三.动态地形Vs 静态地形
地形的渲染通常分为动态和静态的两种。
静态的地形的细节可以是均匀的,也可以是不均匀的。但是细节通常在事先就计算好了,不均匀细节的静态地形有许多的优点:如平原的地貌可以使用较底的细节,而起伏频繁的地方使用较高的细节等级。更为直观的一个例子是赛车一类的对可以到达地方有一定限制的应用,我们可以在离赛道近的地方建立起比较高的细节等级,而在较远的地方使用较少的细节。用这种方式也可以建立起不规则的地形。比如说,它可以沿着赛道的方向建立起一个地形模型,这样可以节省大量的空间。
动态的地形是视点相关的。它是本文将要采用和实现的方法。随着视点的移动,地形网格将被更新。相对于静态地形来说这是一种更为先进的算法。这种方式建立起来的场景更加符合人的视觉特性,即看到的细节是变化的。动态地形网格的建立和更新要耗费额外的时间,但是这种开销是值得的。动态地形网格的建立是比较复杂的,它需要注意很多东西:如何决定细节,如何避免裂缝是两个主要的问题。同时它还应该把不可见的地形部分切除,几何形变(随着细节改变,地形表面的呼吸现象)也应该被考虑到。这些问题都在以后的章节被详细的讨论到。
四:其他
我们说过,在一个室外场景的渲染中。除地形以外其他的一些元素也是十分的重要的,这些元素可以提高场景的真实性。本文将实现其中的一部分元素,这包括:树木、地面细节,太阳、天空已经运动模糊等效果。他们将在本文第三部分集中讨论。