《OGL dev》Etay Meiri Tutorial 20 - Point Light 笔记
point light是有原点,强度随距离衰减的光源。directional light的光线方向是常量,而point light的光线方向是动态的。
光的强度随距离衰减称为“attenuation(衰减)”。
真实光的attenuation符合inverse-square law(反平方定律),公式如下图:
但这个公式在3D图形中效果不好:
- 距离很近时,光的强度接近无穷大。
- 只能控制光的初始强度。
因此,我们使用下图的公式:
- 当常量和线性因子为0,exponential(指数)因子为1时,为真实光的attenuation公式。
- 当常量因子为1时,距离为0光的强度最大,距离增加时减少(分母大于1)。
- 线性和exponential因子影响,光的强度随距离衰减的速度。
point light计算步骤:
- 计算ambient。
- 计算每个像素的光线方向,用来计算diffuse和specular。
- 计算每个像素距离光源的距离,用来计算attenuation。
- 将采样的结果乘以(ambient + diffuse + specular),除以attenuation得到像素颜色。
向shader中的structure数组类型的uniform variable赋值有两种方法:
- 与之前的教程一样,获取数组的每一个元素的每一个成员的位置,逐一赋值。
- 获取数组的第一个元素的每一个成员的位置。使用GL函数,传递某个成员类型的数组,一次调用为数组的所有元素的同一成员赋值。(教程中没有示例)
当光源增加时,迟早会遇到性能问题,deferred shading(延迟渲染)技术能缓解这个问题。(教程没有说明deferred shading的细节)