在基本光照模型基础上,今天探讨一下如何建立各种光源模型.
(1)方向光(或称平行光)
方向光可以看作太阳光,为什么会有白天黑夜呢,就是因为太阳只能照向地球的一个面( dir ),也即一个方向,而且即使地球绕太阳转动时距离会变化,太阳光也没有衰减(no pos, no attenuation 当然,这里是近似的).
dirLight = emissive + ambient + diffuse + specular;
可以发现,上一篇文章中给出的光照公式,就是方向光.
(2)点光源
你可以把点光源看成是家里的电灯,你可以发现,它是从某个位置(pos),向各个方向( no dir )发散,而且,越发散,光强越弱(attenuation),我已经把几个重要的概念用英文标注.在这里,灯光的位置会影响attenuation.那么最终的公式取为:
pointLight = emissive + ambient + attenuationFactor * ( diffuse + specular );
其中attenuationFactor是由顶点与光源位置的距离来确定的.
(3)聚光灯
探照灯就是这种光的代表,它由一个取舍角Thi的概念来控制聚光灯圆锥体的传播,你需要知道灯的位置,灯的方向,以及将要进行着色的点的位置,然后通过他们得到从聚光灯到点的向量V与光的方向D,这时候dot( D, V )求出角,只有当这个角小于取舍角Thi,点才被着色.
为了更好模拟,我们还需要两个角a,b,Thi = a + b;而且0到a的范围表示热区,而a到a+b范围表示衰减区,在热区中,灯光强度不变,而在衰减区中,灯光会衰减(具体衰减策略可以自己定义),总之利用聚光灯,可以形成两个光区,非常漂亮.
这里光源最基本的实现(要不然怎么叫基础...),使用shader,你可以自由的选择光的实现形式(数学..还是数学..),anyway,enjoy!!