1、在GLSL中运用光照,首先需考虑的是光照强度,有了光强,有就明暗和层次感,那么光照强度如何判断?我们可以通过计算顶点的法线向量与光照向量的夹角余弦值(cosine值)来得到。所以,当法线离光照方向很接近的情况下,将会出现亮的色调;当光照方向与法线方向的夹角很大时,渲染的地方就会很暗,换句话而言就是,夹角的cosine值影响色调的强度,Cosine值的计算可以利用下面这个公式,也即是点积公式:
cos(lightDir,normal) = lightDir . normal / ( |lightDir| * |normal| )
当法线向量和光照都被归一化,这个公式将被简化成:
cos(lightDir,normal) = lightDir . normal
2、所以在GLSL编程时经常会看到如下代码:
Vec3 normal = gl_NormalMatrix * gl_Normal;
Vec3 tnorm = normalize( normal );
float intensity = dot( lightdir, n );
这里如果没有进行 normalize( normal );那显然dot是不成行的,即得不到光的强度。
3、光线向量的计算
光线向量即从光源点发出,到顶点结束的向量,所以豪无疑问的是我们首先必须得到光源位置以及顶点位置(以观察坐标为基):
(1)光源位置
我们自己设置一个光源位置,比如:uniform vec3 LightPostion;在应用程序中对其赋值。也可以通过GLSL内置的光照属性结构体来获取,结构命名为gl_LightSourceParameters,大概如下: