在计算机图形学中有多种渲染方式,其中常见的是目前游戏和电影特效中的三角形光栅化渲染方式,这种渲染方式的好处是性能需求较低,但是缺点是真实性方面颇受诟病,特别是倒影、阴影等效果比较容易穿帮。
如果选择光线追踪渲染方式的话,虽说是符合光学原理,但是性能的需求是在太高了,在可见的一段时期内来说,都很难对复杂场景做到每秒三十帧画面的完全光线追踪渲染。目前的电影制作中,即使是《汽车总动员》也只是在倒影、阴影、环境闭塞等应用中完全采用了光线追踪渲染,而直接可视对象则采用了REYES光栅渲染。
id Software著名技术总监约翰·卡马克在2008年接受采访时候曾经对光线追踪技术有如下的评说:“我想,对于传统意义中的光线追踪,即不论是三角形网面或者高序图元这样常规定义的几何体进行光线相交解析处理,我都不怎么相信这样的技术能真如 英特尔所正在推动的那样,可以在主要的渲染任务中占主导地位。从性能立场而言光栅渲染具有巨大的优势,而英特尔他们争辩说只要使用有效的剔除技术就能避免一大堆几何体的计算,但这个论据实际上只是伪辩。因为在光栅渲染中你同样可以使用闭塞查询和条件渲染实现类似的事情。两相比较之下,不管你有多少晶体管可用,光栅渲染都能更有效地使用它们。”
约翰·卡马克对光线追踪并不十分热衷,但是这并非是因为他非常保守以至于希望继续长期使用三角形光栅化渲染技术。事实上在多年前已经有报道指出,约翰·卡马克对于实时渲染的未来有其自己的主意,那就是Voxel Ray Casting体素光线投射渲染技术。
约翰·卡马克对体素光线投射渲染技术的研究并非前两年才开始,事实上在10多年他已经关注其中。在Quake/QuakeⅡ与QuakeⅢ期间,约翰·卡马克就尝试了了多种新兴渲染技术,并用一个代号统称这些研究,即Trinity(三位一体)。Trinity在当时被许多玩家理解为一个未来的产品以及来自id Software的新一代3D引擎。但事实上,id Software的QuakeⅢ引擎仍然是沿用相当传统的技术,约翰·卡马克表示Trinity所研究的技术都没有应用到QuakeⅢ当中,但是由于这个期间的研究相当广泛,因此其中的某些成果将可能在未来的某个时间得到应用。
在QuakeⅢ开发伊始时,约翰·卡马克也同步开发出两个体素光线投射引擎,这两个引擎虽然差不多已经可以用软件方式运行,但那将是非常低的分辨率下才行得通,和采用硬件渲染多边形相比,这样的结果并未能达成开发目标。
当时约翰·卡马克对体素光线投射渲染的内存访问模式以及所有要点做了一个分析,发现如果能够使用硬件执行 体素光线投射追踪器的话,所需的硬件成本将比现有的所有三角形光栅器大大降低,如果有这样的东西出现的话,那么它在许多情况下能表现的视觉效果将比单纯使用软件渲染具备高得多的说服力,换句话说,在具备硬件执行的情况成立下,体素光线投射才会具有较高的使用价值。
讨论体素光线投射渲染技术自然离不开《Outcast》—一个1999年7月上市的游戏,这是11年前的事情,当时的3D引擎已经基本上都迁移到支持3D图形卡加速卡上了,游戏玩家也已经完全认同3D图形卡是3D游戏的必备PC硬件,《Outcast》却逆天而行,采用了完全基于软件(CPU)的3D渲染器。
《Outcast》的高分辨率只有512×384(这在当时都可以说是一个略低于主流及格标准的分辨率),你需要一个先进的处理器而不是一块3D图形卡。对系统资源的高度渴求并非这个引擎让人留下印象的唯一原因,使用体素光线投射渲染技术同样让这个游戏的渲染显得真正的与众不同(图1)。
图1 游戏Outcast中的地形采用了Voxel(体素)渲染
如果你手头还有这个游戏(或者其他Novalogic公司的游戏)的话,不妨重温一下,你就会发现这些标榜基于Voxel的渲染实质上只是在地形构造的一种简单构造方式。游戏中的地形是基于高程图(height map),高程图可以让环境中的每个点都有一个可能的高度,这使得一些复杂的构造例如拱门就无法实现。
这个限制倒并非什么不可克服的限制,因为像拱门这样的构造在自然界中其实本身就相当罕见。尽管如此,地形显示是相当简单的,从视点出发就是以一列一列的方式排列。对于每一列,它的大值Y会被存储起来(Y-buffer),在渲染的时候,只有那些从视点观看方向Y值大于靠近视点方向前列的像素才会被显示(图2)。
图2 这样的渲染方式能避免看不见的部分被渲染,从而提高渲染效率。
在了解了这些历史后,我们接下来将看看体素光线投射渲染技术对我们的未来意味着什么,而第一步所需要了解的是体素、八分树(oct rees)、光线投射(ray casting)等技术名词是什么意思。