DX9压榨专家 半条命2神奇渲染引擎揭
我们可以通过下面简单的两幅图来比较一下在三维动画软件中使用光能传递与否会给画面带来什么样的区别。
这是一个十分简单的房间场景,房间的天花板上只有一个简单的聚光灯。两幅画面都是通过3DS MAX的默认渲染器渲染的:
图1.a
没有使用光能传递,场景只受到直接光照;没被聚光灯照到的地方就是一片漆黑,光照效果十分简单、生硬。
图1.b
使用光能传递算法渲染的效果,场景既受到聚光灯直接光照,也受到间接光照;即使没有受到灯光直射的天花板和墙壁上半部分也被从地面和墙壁下部反射过来的光线照亮。而且这些受间接光照的部分也是明暗不一的,比如墙角、柱子的顶部与天花板相接的部分就比墙面暗,因为这些部位接受到的间接光照能量比其他部位少。和图1.a相比,场景明暗层次丰富,光照效果柔和自然,真实感大大提高,但是实际上场景数据没做任何改动。
在《半条命2》的渲染引擎中,就使用了这种光能传递技术。我们可以通过下面两张截图来对比一下,打开和关闭间接光照时游戏中的效果。
图2.a
只有直接光照,不使用光能传递。场景比较阴暗,明暗分界比较强烈和生硬,不自然。
图2.b
加入了间接光照。画面中即使没被灯光照亮的部分也比较明亮,且其明暗层次更加丰富一些,更接近于人的真实感受。
目前计算光能传递的算法有很多种,其本质是计算出每个物体表面上每一点面积所接受到的全部的光能。接受到的光能越强,该点面积就越亮。而计算光能的关键步骤,实际上就是计算前面提到的间接光照效果的过程。
尽管算法很多,可是无论哪一种都是十分复杂的。虽然现在的显示硬件性能已经大幅提高,但是像光能传递这种极为复杂的算法还是很难完全在游戏进行时用实时的方法来实现。
所以,目前在游戏中一般是通过三维动画软件或者游戏开发者自己编写的光能传递计算程序,将场景中的静态光影效果事先计算好,并保存在关卡场景模型的光照贴图上或顶点颜色信息里,在游戏运行时直接使用这些贴图或顶点颜色就行了。<