◆光照和阴影的实现方法以及优劣
首先来谈一下光照和阴影,对于一个在三维环境中的物体,人类的视觉系统一般通过相对位置来判断具体物体的实际坐标位置,而对于3D渲染来说,就要提供光源和阴影对于物体照射的深度和颜色来为玩家的眼睛服务,模仿现实中情况让使用者知道物体的实际位置,这需要完全基于物理效应和实时的光照处理。
举个较为具体的例子,当一个物理靠近另一个明亮而且有色的物体,比如一个白球接近一面红色的墙壁时,白色的球会逐渐明亮而且反射出红色的光,红色的光还会逐渐加深,这时候我们的视觉系统就会感知并且给予大脑一个信号,这个白球正在逐渐靠近墙壁。这在某些游戏中比如类似“乒乓球”中就是很直接的应用,如果光照和阴影非常真实,那么玩家就能更容易和轻松的判定一个球在三维空间中的位置,从而作出决定。顺便提一下,目前的游戏在这方面做得很不够,笔者就感觉《实况足球》中一些打得很高的球无法判定位置,只能看地面简单的投影来粗略的判断。
下面的截图很好的表现了这方面的应用,数以千计的物体通过逼真的光照和阴影精确的将具体的位置展现,光线追踪技术让这一现实的难题很容易的在如今的3D渲染中变为现实。有很多不同的渲染方法来实现这样的效果,比如“光照/阴影映射”、“辐射”以及“射线追踪”,射线追踪更适合在类似CPU这样的架构体系中运算,前两者则是GPU架构体系喜欢的处理方式,这也是前两者被广泛应用的原因。
『开启全局光照(左)和关闭全局光照的效果对比』
“光照/阴影映射”为一个(或多个)纹理将每个光源进行渲染,不管这个光源是否在相应的像素可见(如果不可见会用阴影表现),shader程序会在最后决定混合的结果为像素着色。这种方法实现光照的结果非常直接,对于散射光照有较好的渲染效果,但是对于反射/倒影的处理不好,而且对于大数量的物体处理或者区域光源的处理不好,间接照明也表现不佳。
射线追踪的光照技术会决定光照的第一点,并且追踪每一条光线,精确的计算这些光线经过反射、折射和散射等等随后的颜色,必要的时候可以多次反弹从而实现间接照明这样复杂的渲染。不过因为有大量复杂的数据结构和相应的存储空间,所以在处理动态光源的时候效率比较低。
回到DX10.1上来,因为加入了批量立方贴图这个功能,让游戏在处理大量物体和光源在3D环境中的多重反射和光照实现了效率的可能,增强了画质的效果。
◆球形光照的技术实现和画质优势前面我们分析了几种光照技术的优劣,下面我们就来看看球体照明——ATI最新HD 3800系列显卡所能实现的高效率高画质光照技术。球体照明是一个和渲染结合的非常好的技术,光照阴影映射和间接照明支持几乎无限数量的动态光源,结合现实的反射情况,还能实现软阴影。利用DX10.1提供的阵列立方贴图和几何处理单元,可以实现全局照明系统,达成数以千计的物体在一个复杂场景中的互动。
这项技术的要点就是将场景划分为多个3D阵列的立方体,立方体的每个表面都会赋予一个相对简单的渲染,渲染的出发点是立方体的中央向外看的视角(所谓的“光照探针”),立方体表面渲染的精度和细节不一定要求与最终的完美画面相媲美,但是很容易被控制,从而可以在画质和性能之间做一个取舍,当立方体的6个表面都渲染完成后,就生成一个立方贴图纹理。
下一步的工作就是将立方体映射转换为一个球形的映射,让它符合球体的物理、光照特性,有了这个步骤,尽快的确定光照的数量以及最终的色彩渲染变得更为简单,因为立方体的计算相对简单,至于光照的数值,可以通过“光照探针”从相邻的立方贴图中取得插值运算的精确。
这种照明技术是在一个封闭环境中应用的范例,因为它能够通过整体环境的表现作为计算的参考,这种计算方法具有高度的扩展性,并且渲染质量可以随意的控制,对于立方体数量和表面精度的控制就可以达成。DX10.1的立方纹理阵列,允许极大数量的立方纹理被渲染和采样,而且可以并行处理,这对于GPU或者多GPU系统是一个非常好的消息。