WebGL 平行光和环境光

来源:互联网 发布:帝国cms首页模板修改 编辑:程序博客网 时间:2024/04/28 07:26

冯氏反射模型引申了这个四步走的光照系统,首先所有的光线都有以下两个属性:

  1. 发生漫反射光的RGB值。
  2. 发生镜面反射光的RGB值。

其次所有材质都有以下四个属性

  1. 反射的环境光RGB值
  2. 反射的漫反射光RGB值
  3. 反射的镜面反射光RGB值
  4. 物体的反光度,它决定了镜面反射的细节

对于场景中的每一点,它的颜色都是由照射光的颜色、材质本身的颜色和光照效果混合起来的。所以,根据冯氏反射模型,为了解决场景中的光照,每条光线我们都需要知道两个属性,每个物体表面上的点都需要4个属性。环境光应当是自然的,而不是特定的光线,但我们依然需要找到一种方法来储存整个场景中的环境光;有时可以用最简单的方法,就是为每个光源设置一个环境等级,然后把它们都放到一个单一项中。


漫反射光中从一个方向上来的光可以简单分为两种。一种是简单的平行光,来自于同一个方向的平行光束穿越整个场景。另一种是点光源,来源于场景内的一个点发出的光线,也就是说每个地方的光线角度都不一样。

对于简单的平行光来说,当光线打到物体表面的顶点上(图中的A点和B点),入射角永远都是相同的。想一下太阳光,光线都是平行的。

相反,对于点光源,A点和B点的入射角是不同的。这也就意味着对于点光源,我们需要为每个顶点都计算出各自不同的光线入射角度;然而对于平行光,我们只需要使用一个固定的角度。

我们同样知道每个顶点上的光照效果取决于光线的入射角度,所以我们需要找到一个可以代表物体表面朝向的东西。对于3D几何体,最好的办法就是指定顶点所在表面的法线向量,这个向量允许我们用3组数字表示出物体表面的朝向。

在二维世界中我们可以同样使用切线来达到这一目的,但是在三维世界中,切线的垂线是指向两个方向的,所以我们要用两个向量来表示它,而表示法线我们使用用一个向量就可以了。


我们指定了顶点平面的法线向量,还有用来表示光照方向的向量,我们还需要计算出物体表面漫反射了多少光。这与这两个向量之间角度的余弦值成正比。

幸运的是,计算这两个向量夹角的余弦值并不是什么复杂的计算,如果它们两者的长度都是1,那我们只要使用这两个向量的点积即可。更幸运的是,点积运算是内置于着色器的,我们只要使用这个叫做dot的函数即可。





原创粉丝点击