Shaders for Game Programming and Artist在基础理论上并没有进行深层次挖掘,对于很多基础理论都是直接进行使用,而不讲来历。毕竟这是本讲实现的书,而非基础。如果要看基础的话,图形学的书还是强力推荐。
本书中使用的点光源,从理论上讲,应该讲叫理想点光源(Ideal point lights),因为世界上根本不存在真正的点光源。但是照明效果与现实上的点光源区别并不大,所以理想点光源模型还是有用武之地。
书中并没有解释点光源的几何衰减Attenuation的来历:
即Attenuation = 1/(A*d2 + B*d + C),也没有解释为什么方向光源没有距离衰减。这两个问题在"Advanced Lighting and Materials with Shaders"[Kelly Dempski & Emmanuel Viale著]中均有详细的解释。在此搬运一下:
1. about Ideal point lights(有关点光源)
请记住,点光源是一切光源的基础,方向光源(Directional Light)跟聚光光源(Spot light)都是点光源的特殊情况。
下边我们来看看衰减公式究竟是如何来的:
一个球体的表面可以分割成一个个的小块,正如同一个圆可以分割成若干的圆弧一样,如下图:
将每两个小三角形看成是一个整体,就是一个小“正方形”(对于无限次分割的球体表面,可以将其看做是正方形,实际数学上并不是严格的正方形因为每条边是有弧度的)。
理想点光源是一个数学模型,它没有大小,没有形状,只有一个位置作为球心。
点光源的距离衰减,也叫几何衰减。
a point light was described as a source of power (energy per unit of time) with its power radiating in an expanding sphere(一个点光源可以被描述为一个能量源,它的能量以球面方式,向外扩张)。
Now imagine that you encase the light inside a sphere of some radius. For a given amount of power, a smaller sphere receives more energy per unit of surface area than a larger sphere does. Conservation of energy dictates that a sphere with a larger amount of surface area must receive less energy per unit of surface area(现在想象,你把点光源用球心在点光源位置处的球体包装起来,对于给定量的光源强度,半径较小的包装球体上的单位面积接收到的能量,要大于 半径较大的包装球体上的单位面积所接收到的能量。能量守恒定律决定了半径较大的球体的单位面积上的接收到的能量较小)。
给定强度的光源,我们可以认为是光线的疏密程度,也就是认为光线与光线的夹角是给定的。如上图,Sa是较小的包围球上一个小“正方形”的面积,Sb是较大的包围球上一个小“正方形”的面积,从图中可以看出在光线疏密程度一样的情况下,穿过Sa的光线与穿过Sb的光线数量是一样的(光子数目一样),Sb明显是大于Sa的。如果在Sb上取一块面积等于Sa的区域,那么毫无疑问,这块区域接收能量小于Sb接收到得能量,同时也小于Sa接收到的能量。
那么如何衡量衰减跟距离的关系呢?
Sa占小球的表面积的比重 = Sb占大球表面积的比重,我们假定它等于这个比重 = S_factor ,它是小于等于1的,小球半径为r1,大球半径为r2。
再假定,穿过Sa和Sb的光子数目为K,也可以为认为是亮度为K,一个道理。
那么单位面积接收到的光子数:
对于小球K/Sa = K/(4π* r12 * S_factor)
对于大球K/Sb = K/(4π* r22 * S_factor)
我们将K除到分母上,有:
对于小球K/Sa = 1/(4π* r12 * S_factor/K) = 1/[(r12) * (4π* S_factor/K)];
对于大球K/Sb = 1/(4π* r22 * S_factor/K) = 1/[(r22) * (4π* S_factor/K)];
设4π* S_factor/K = A,于是就有光照强度随包围球半径变化的公式为1/(A *r2); r就是被照明顶点到光源的距离,写成d就是1/(A * d2),可以看到光照强度跟被照亮顶点到光源距离的平方是成反比的。这就是距离衰减公式分母中二次项的来历。至于一次项和常数项,图形学研究者另外增加了这两项,一次项代表了线性衰减,而常数项相代表一个偏移,使得该衰减更加灵活。不过值得注意的是,一次项和常数项对于亮度的影响是远远小于二次项的影响的。
2. 方向光为何没有衰减?
假设A是距离点光源无穷远的一个有待照亮的物体,A上距离光源最近的点是B,最远的点是C,因为光源处于无穷远处,可以认为所有光线是平行的,假设B到光源距离为dB,C到光源的距离为dC:
于是我们有点B处的距离衰减值为:1/(A*dB2 + B*dB + C);
点C处距离衰减值为:1/(A*dC2 + B*dC + C);
由于点B,C距离光源实在太远了,几乎是无穷远,可以认为B,C两点就是同一点,因此他们的衰减是相同的,等价于无衰减!
endl//