光线跟踪是一种非常成功的生成真实感图像的算法。要研究光线跟踪算法,首先要研究各种照明模型。
这里要记住一点,物体本身是没有颜色的,你看到的一个物体的颜色是物体与入射到它表面的光线作用后射到你的眼睛里的光线(这里只考虑反射颜色,不考虑透明体的投射颜色)。也就是说,是物体关于颜色的属性(比如 对于不同波长光的反射率)刻画了物体和某个波长的光作用后能够呈现给你什么颜色。
泛光模型(ambient reflexion)
泛光模型是最简单的模型。该模型刻画得不是直接光源(如电灯,太阳)对物体照明效果的贡献,它刻画的是周围环境反射光(间接光源,如来自地面和墙壁的反射光)对物体表面照明效果贡献。其假设就是这些间接光源的综合效果是各向同性的,即任何一个方向的来自间接光源的入射光都是等强度的,同时也假设物体反射出的光也是各向同性的,即反射到各个方向的光都是等强度的。泛光模型的数学公式非常简单,即
I=Ka * Ia 其中Ka(a是下脚标)表示物体表面对泛光的反射率,Ia(a是脚标,字母I 表示强度Itensity)I是物体泛光反射强度。公式中的I和K都是有三个分量的向量,因为计算机图形学中的颜色都是由红(R)绿(G)蓝(B)三个基色按照不用的比例合成出来的。所以其实这个公式的可以写成如下公式
[R G B]=[KaR KaG KaB].[Ra Ga Ba] 即物体表面对泛光的反射率等于I与K的点积。KaR KaG KaB 取值范围是0~1(因为反射光的强度不可能大于入射光)。
如果仅用以上公式计算一个物体上每个点的光亮度,对于一个一般物体(这里"一般"指的是一个物体表面反射率处处相同),其反射的光亮度是个定值。由此渲染的出的图像几乎没有真实感,所以这个模型还不够“真实”。要想够真实,就得够复杂,就得考虑添加其他的成分,于是乎下面就有了Lambert漫反射模型。
Lambert漫反射模型(diffuse reflexion)
刚才的模型只考虑了间接光源,而且还把间接光源简化成了一个各向同性的入射光。对于主要成分直接光源(比如电灯,太阳)还没有进行建模。Lambert漫反射模型就是对直接光源在物体表面产生的光照效果的一种建模。
Lambert模型考虑到了直接光源的光入射时候的方向性。物体在反射的时候可以产生漫反射和镜面反射。其中漫反射的反射光是各向同性的,即反射光强度大小在各个方向都相同,当然了,这个大小跟入射光的角度和强度有关。镜面反射光的大小和强度不仅跟入射光的角度和强度有关,还和观察者的角度有关。自然界中的大部分物体都是漫反射体,比如房屋,地面,花草树木等等。
Lambert漫反射模型计算公式为Id=Kd * Ie * cos(alpha) Id表示物体表面反射光的光亮度 ,Kd是物体表面的反射率,Ie是直接光源入射光的光亮度,alpha是入射角。
当我们把泛光模型和漫反射模型结合起来时,可以得到一个比较有真实感的模型,如下公式:
I = Ka*Ia + Kd*Ie*cos(alpha)
其中Ia表示泛光强度,即各种间接光源综合后的光照的强度,Ie表示直接光源的光照强度。实践中。Ia要比Ie小得多(间接光源肯定没直接光源强),所以Ia的大小一般取0.02*Ie到0.2*Ie之间的一个值。
采用该模型生成的图像就真实多了。但是,现在问题来了:间接光源的光通过泛光模型搞定了,直接光源的光的漫反射通过Lambert模型搞定了,直接光源的镜面反射(specular reflexion)还没建模呢,咋整?那些玻璃反光贼亮的效果咋搞出来?于是有了Phong模型
Phong镜面反射模型(specular reflexion)
镜面反射光是有一定方向的,遵循镜面反射定律(入射角等于反射角)。这是对于理想镜面而言,对于非理想镜面,这个规则被扩大化。指的是反射光在镜面反射角的方向取最大值,在该角度附近也有强度,但是小于反射角方向的强度,且偏离越大强度就越小。于是Phong就用如下公式来对这个现象进行建模
Is=ks * Ie * cos(theta)^n
其中Is就是反射光的强度,ks表示镜面反射率,Ie表示入射光强度,theta是观察方向如反射角方向的交角(反映偏离程度),n叫做高光指数,或者是汇聚指数,n越大则反射光强度越汇聚在反射角方向的光线周围,当n取无穷大时候,可认为该表面是个理想镜面。可以看出,ks 和 n 是物体的固有属性,镜面反射光的强度与观察者的位置有关,当观察者位于理想镜面反射光线的位置时候,可以看到高光,如果偏离较大,咋看不到高光,这是跟现实吻合,举个例子。夏天走在路上让对面大厦的玻璃幕墙晃到了眼睛,但是走几步换个角度后再看玻璃幕墙他就不晃眼了,原理就是这时候偏离角较大,看不到“高光”了。
用一个表格总结一下以上三个模型:
是否考虑观察角度
考虑 不考虑
是否
考虑 考虑 镜面反射模型 漫反射模型
入射
角度 不考虑 无 泛光模型
以上被称为局部光照明模型,因为这些模型仅考虑了从光源直接发出的光线对物体表面光亮度的贡献,没有考虑光线在物体之间的相互反射和透射(泛光只是大概的考虑了一下非直接光源的光照,不够精确)。所以真实感还有所欠缺,有所欠缺就是表示有提高的空间,于是乎Whitted就搞出了一个整体光照模型。
Whitted整体光照模型(global illumination)
一个观察者看到的物体表面一点P的发出的光线包含了三个部分
(1) 光源直接照射该点引起的反射光亮度 Ic
(2) 该点的沿着观察方向的镜面反射光ks*Is
(3) 该点的沿着观察方向的透射光kt*It
如下图所示,
这个整体光照模型的实现用的就是光线跟踪。即递归的寻找r和t方向的点发出的光强Is和It。这个Is和It其实就好像是观察者又跑了P点沿着r和t方向观察看到的东西。这样递归的算下去,直到达到预定的递归停止条件,然后算出来个I。
关于光线跟踪的原理,我会另外在写一篇文章说明。
PS:这是第一次在CSDN是写一篇比较长的博文讲讲自己学习的感受,希望能和大家多交流多讨论,不怕犯错,就怕明明错了还不知道,以为自己是对的。该拍砖拍砖,如果有问题也欢迎留言!
本文主要参考了彭群生老师等所著的《计算机图形学应用基础》一书,这本书写得非常简单明了,薄薄的一本,非常适合初学者入门。