间接光照 (环境光照)
随着容积阴影与阴影贴图等先进投影技术的引入,3D游戏中的光影效果在过去几年里有了翻天覆地的改进。尽管如此,几乎当前所有的游戏在光影处理上都存在一个重大缺陷——那就是缺乏对“间接光照”的表现。比如当年以出色的光影效果而闻名的DOOM 3,虽然其光影效果令玩家们印象深刻,但当时仍有很多人发现了该游戏在处理光照效果上存在一个重大缺陷:游戏中的场景处于光源之内的就“灯火通明”,而光源之外就是“漆黑一片”,明亮区域与黑暗区域之间缺乏过渡,完全没有所谓的“半影区域”,这样整个环境看起来就显得相当生硬突兀。实际上这就是由于DOOM 3缺乏对“间接光照”的计算所造成的,在现实环境中,光束的行程并非只局限于从光源出发然后到接收物体处结束,事实上由于自然界中的大部分物体对于光线都存在不同程度的反射率,所以光束在到达接收物体表面之后又有一部分被反射到周围的物体上,这时光线的接收体已经变成了“环境光源”,对其周围的物体跟场景能够产生光照效果。光线的跳转、转移使得“直接光照”以外的区域也能受到一定程度的光照,从而产生一种“半亮半影”的自然过渡区域,而这种效果正是“间接光照”所要表现的。
DOOM 3几乎没有考虑到间接光照的计算,上图灯的上方跟人物周围的场景漆黑一片
事实上不仅仅是DOOM3,后来发布的Riddick、FEAR、SCCT、Quake 4等光影效果出众的游戏同样缺乏对间接光照的支持。只有HL2采用radiosity Normal Maps技术在一定程度上实现了间接光照,但由于HL2中动态光源太少加上蹩脚的投影技术,最终出来的效果并不出众。而跳票王STALKER也秘密内置了对间接光照的支持,虽然效果比HL2要好许多,但由于性能代价太大以及算法还不够完善等问题而被开发商隐藏起来,玩家只能通过控制台来打开。
不出意外的话,Crysis将成为首个对间接光照支持最完整、效果最出色的游戏。对于间接光照的实现,Crytek原本打算采用目前最广受认可的全局光照算法——光子映射来预计算辐射度信息,并采用类似HL2的做法将光线的辐射信息保存在贴图中,crytek甚至为此而准备了一个叫做“3D传输采样器”的工具,可以很方便地运用光子映射算法来计算全局光照数据。不过由于数据存储量以及计算量太大,Crytek最终抛弃了这种方法。
实时环境关照贴图可以将预先计算的环境光照信息添加到室内环境的表面信息中,
包括当前环境的入射光位置跟颜色都可以被动态添加到用于照明室内场景的光照强度中,
此举可以显著提升实时逐象素光照跟阴影的逼真度。
Crytek改用另一种更加简单的做法——Real-Time Ambient Map(实时环境光照贴图,最近开始走红的实时间接光照实现算法,STALKER在室外场景就采用了该技术来实现环境光照,下文简称RAM),跟之前的做法相比,采用RAM每象素只需保存一个标量环境遮蔽值,该数值可以通过向所有方向发射光线来计算,而且最终得出的数值还可以反复使用。RAM在着色程序中根据带有遮蔽值的象素、相对于表面的光照位置以及光照颜色和表面法线等信息来计算物体表面对光线的接收程度。值得一提的是,这里计算得出的结果只是一个近似值,精确度不高,但是对于欺骗人眼还是没有问题的。
室外场景里使用了2.5D环境光照技术,该技术可以根据环境物体(比如植物、建筑物)对光源的遮挡情况,
正确计算出物体接收到的光照量
为了提高RAM的效率跟适用范围,Crytek的天才程序员又对其进行了改进,改进后的算法称为“Screen-Space Ambient Occlusion” (屏幕空间环境光遮蔽,下文简称SSAO)。SSAO通过采样象素周围的信息,并进行简单的深度值对比来计算物体身上环境光照无法到达的范围,从而可以表现出物体身上在环境光照下产生的轮廓阴影。由于可以利用我们前面介绍过的“逐象素场景深度计算”技术计算得出的深度值直接参与运算,所以SSAO的效率相比RAM有了显著的提高。