《OGL dev》Etay Meiri Tutorial 20 - Point Light 笔记

point light是有原点,强度随距离衰减的光源。directional light的光线方向是常量,而point light的光线方向是动态的。

光的强度随距离衰减称为“attenuation(衰减)”。

真实光的attenuation符合inverse-square law(反平方定律),公式如下图:

但这个公式在3D图形中效果不好:

  1. 距离很近时,光的强度接近无穷大。
  2. 只能控制光的初始强度。

因此,我们使用下图的公式:

  1. 当常量和线性因子为0,exponential(指数)因子为1时,为真实光的attenuation公式。
  2. 当常量因子为1时,距离为0光的强度最大,距离增加时减少(分母大于1)。
  3. 线性和exponential因子影响,光的强度随距离衰减的速度。

point light计算步骤:

  1. 计算ambient。
  2. 计算每个像素的光线方向,用来计算diffuse和specular。
  3. 计算每个像素距离光源的距离,用来计算attenuation。
  4. 将采样的结果乘以(ambient + diffuse + specular),除以attenuation得到像素颜色。

向shader中的structure数组类型的uniform variable赋值有两种方法:

  1. 与之前的教程一样,获取数组的每一个元素的每一个成员的位置,逐一赋值。
  2. 获取数组的第一个元素的每一个成员的位置。使用GL函数,传递某个成员类型的数组,一次调用为数组的所有元素的同一成员赋值。(教程中没有示例)

当光源增加时,迟早会遇到性能问题,deferred shading(延迟渲染)技术能缓解这个问题。(教程没有说明deferred shading的细节)