首先来谈一下光照和阴影,对于一个在三维环境中的物体,人类的视觉系统一般通过相对位置来判断具体物体的实际坐标位置,而对于3D渲染来说,就要提供光源和阴影对于物体照射的深度和颜色来为玩家的眼睛服务,模仿现实中情况让使用者知道物体的实际位置,这需要完全基于物理效应和实时的光照处理。
举个较为具体的例子,当一个物理靠近另一个明亮而且有色的物体,比如一个白球接近一面红色的墙壁时,白色的球会逐渐明亮而且反射出红色的光,红色的光还会逐渐加深,这时候我们的视觉系统就会感知并且给予大脑一个信号,这个白球正在逐渐靠近墙壁。这在某些游戏中比如类似“乒乓球”中就是很直接的应用,如果光照和阴影非常真实,那么玩家就能更容易和轻松的判定一个球在三维空间中的位置,从而作出决定。顺便提一下,目前的游戏在这方面做得很不够,笔者就感觉《实况足球》中一些打得很高的球无法判定位置,只能看地面简单的投影来粗略的判断。
下面的截图很好的表现了这方面的应用,数以千计的物体通过逼真的光照和阴影精确的将具体的位置展现,光线追踪技术让这一现实的难题很容易的在如今的3D渲染中变为现实。有很多不同的渲染方法来实现这样的效果,比如“光照/阴影映射”、“辐射”以及“射线追踪”,射线追踪更适合在类似CPU这样的架构体系中运算,前两者则是GPU架构体系喜欢的处理方式,这也是前两者被广泛应用的原因。
『开启全局光照(左)和关闭全局光照的效果对比』
“光照/阴影映射”为一个(或多个)纹理将每个光源进行渲染,不管这个光源是否在相应的像素可见(如果不可见会用阴影表现),shader程序会在最后决定混合的结果为像素着色。这种方法实现光照的结果非常直接,对于散射光照有较好的渲染效果,但是对于反射/倒影的处理不好,而且对于大数量的物体处理或者区域光源的处理不好,间接照明也表现不佳。
射线追踪的光照技术会决定光照的第一点,并且追踪每一条光线,精确的计算这些光线经过反射、折射和散射等等随后的颜色,必要的时候可以多次反弹从而实现间接照明这样复杂的渲染。不过因为有大量复杂的数据结构和相应的存储空间,所以在处理动态光源的时候效率比较低。
回到DX10.1上来,因为加入了批量立方贴图这个功能,让游戏在处理大量物体和光源在3D环境中的多重反射和光照实现了效率的可能,增强了画质的效果。