OpenGL自制3D游戏引擎入门XII

Light Casters 投光物

我们目前使用的光照都来自于空间中一点,但现实世界中我们有很多种类的光照,每种的表现都不同。将光投射到物体的光源讲座投光物(Light Caster)。那么这一节我们将讨论集中不同类型的投光物,模拟不同种类的光源进一步丰富场景。

一、平行光

  1. 当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行。不论物体和观察者的位置如何,看起来所有的光都来自于同一个方向,当我们使用一个假设光源处于无限远处的模型时,她就被称为定向光,因为它的所有光线都向着相同的方向,它与光源的位置是没有关系的。定向光非常好的一个例子就是太阳光,太阳距离我们并不是无限远,但是它已经远到在光照计算中可以将其视为无限远了。

  2. 因为所用的光线都是平行的,所以物体与光源的相对位置是不重要的,因为对场景每个物体而言光线的方向是一致的,正因如此场景中的每一个物体的光照计算都会是类似的。

  3. 我们可以定义一个光线方向向量而不是位置向量来模拟一个定向光,着色器的计算基本保持不变,但这次我们将直接使用光的direction向量而不是通过direction来计算lightDir向量。

     struct Light 
     {
         // vec3 position; // 使用定向光就不再需要了
         vec3 direction;
    
         vec3 ambient;
         vec3 diffuse;
         vec3 specular;
     };
     ...
     void main()
     {
     vec3 lightDir = normalize(-light.direction);
     ...
     }
    

可以看到我们对light.direction进行取反,我们目前使用的光照计算需求一个从片段至光源的光线方向,但人们更习惯定义定向光为一个从光源出发的全局方向,所以我们需要对全局光照方向向量取反来改变它的方向,使之成为指向光源的方向向量并对其进行标准化

(つづく)

清流の国 Pid:60467270


OpenGL自制3D游戏引擎入门XII
https://baifabaiquan.cn/2021/04/24/OpenGL入门XII/
作者
白发败犬
发布于
2021年4月24日
许可协议