物体本身对光会有不同的吸收、反射、透射等特性,另外物体本身也可能会有发光的特性。
所以不同的材质对光的反应是不同的。
在自然环境中,通常存在许多不同的光源,如太阳光、月光、灯光、星光、生物光等等。
按照类型来分,它们可分为点光源、平行光源;
按照构成光的色谱来分,可以分为单色光、复合光;
按照物理性质来分,可以分为发射光、漫反射光、反射光、折射光等。
自然场景通常是由许多不同的光综合作用效果下的场景表达。
环境映射(Environment Mapping)模拟了一个物体反射它周围环境的表像,这就好像我们在池塘水面看到的映衬树影的情形。
尤其是在水面可视化、玻璃镜面效果等模拟中,环境映射模型为更加真实的自然场景提供了更加沉浸感的技术实现。
根据场景中是否只考虑光源对物体的光照影响,可将照明类型分为局部照明和全局照明两大类。
1.局部照明
局部照明就是只考虑光源对物体的照明,忽略了物体间的相互影响。
但是因为真实场景中物体之间的照明关系往往是客观存在的,所以局部照明是简化的、不完整的物理模型。
局部照明的模型一般可以表示如下:
其中第一项是环境光,是为了场景的亮度需要而引入的一个虚拟的量。
后面的求和项是考虑多个光源的情况。
每个光源对物体的影响主要包括漫反射和镜面反射两部分。
考虑了距离的影响,远距离接收到的光强会较弱。
中括号里面第一项是漫反射项,第二项是镜面反射项,其系数与物体本身的性质有关,指数部分是考虑物体的光洁度等因素。
局部照明需要单独考虑阴影算法。
2.全局照明
全局照明不但考虑了光源对物体的照射,还考虑了物体间的相互作用,因为在多个物体的场景中,某个物体所受的光照影响不仅仅来自光源,还有来自周围其他物体的反射投射光等间接照明,将周围所有物体和场景的影响考虑进去以后建立的物理模型就是全局照明模型。
全局照明的算法因为考虑全面,所以不需要关于阴影的附加算法,因为它本身已经计入了阴影的形成过程。
关于全局照明有两种基本的算法:光线追踪法和辐射度法。
其中光线追踪法是关注于镜面反射光的,因为根据折射反射定律,可严格追踪镜面反射的光线的方向。
跟踪光线进行追踪,遇到物体后按一定公式分为折射或者反射光线,再继续追踪,知道满足追踪结束的条件,对所有光线追踪完后,即可获得场景光照信息。
一般采取逆向追踪法,即从观察到的点出发去反向追踪到光源,可以节省掉不必要的计算。
辐射度法是关注于漫反射光的,即从能量角度出发,光源照射物体后向各个方向均匀发光,根据朗伯定律,可以计算出漫反射到各个方向的光强大小,然后接着进行辐射,直到整个场景被照亮。
注意由于漫反射是与视点无关的,所以与光线追踪法不同,辐射度法是不依赖于视点的。
以上是两种最基本的全局光照算法,因为都只着重考虑了光照的一种类型,所以叫做“部分的全局光照算法”。在此基础上,还有衍生出的几种全局算法,比如分布式光线跟踪、二路光线跟踪、多路方法等。