经典光照模型-明暗处理

兰伯特lambert[朗伯]明暗模型

遵循余弦定理

[l 为反射角, n 为模型表面的法线]

l和n都需要normalizer, 这样l和n的向量长度都是1

l·n的结果为|l| |n| cosθ, 如果l和n已经normalizer, 那么|l|和|n|结果都为1, 则l·n直接等于cosθ

当θ为0°则结果为1, 相当于最亮, 当θ为90°, 相当于最暗, 没有颜色

θ
n
l

光照示意图

img

cosθ 0°~90°曲线范围

漫反射系数Cr

漫反射系数是表面所有反射光线的一部分, 对不同的颜色分量, 是不同的

例如表面是红色的, 那么他能反射红色的入射光, 将大于反射蓝色的入射光

所以漫反射系数是一个三种颜色的分量[0-1, 0-1, 0-1], 每个分量都是0-1之间的值

光线强度Cl

光线强度也在[0-1]的取值范围内

需要保证漫反射系数在[0-1]中, 同时想增加光线强度的效果, 新增一个参数

避免点积结果为负值

θ
n
l

当光线和法线的夹角大于90°, 则反射角越来越远离法线的方向, 则点积结果会越来越接近-1

为了避免出现负值, 对点积进行max限制为0

因为当光已经在表面的朝向了, 那么应该是不受光, 所以是黑色

环境光Ca

即使所有的光都在法线的背面[呈现黑色]

但是在现实情况中, 其实会有很多连续反射后再接触到表面, 然后反射出微弱的颜色

光照强度的基础上, 再加入一个环境光结果为

环境光是RGB三个分量, 可以将环境光颜色当成是场景中所有表面的平均颜色

注意:

c_a+c_l(1, 1, 1)$$否则最后结果分量也将会 > 1, 如果最后结果>1, 也应该将结果限制在1以内

在shader中, 片源着色器, 会对结果自动clamp到[0, 1]之间

Phone光照模型

高光

随着物体表面越光滑, 会出现越明显的高光[光斑]

例如桌子的表面和钢板的表面, 粗糙程度影响了高光[光斑]的明显程度和范围

并且随着眼睛的移动, 这些光斑也会在物体的表面移动

θ
n
l
Actor
θ
σ
r
e

L: light

N: normal

R: reflect

E: eye

眼睛的方向e和反射光方向r中间的夹角为σ

当σ越小, 高光应该越明显, 反之, 越来越减弱

备选公式: 余弦公式

问题

  • 点积可以为负, 需要通过if或者max来进行限制为0
  • 这个公式产生的高光比实际生活中看到的范围要大得多

指数公式

高光的最大值位置是正确的, 颜色也是正确的, 只是范围过大了, 在不减小最大值的情况下, 可以通过提高幂次方, 将范围降低

这里的p称为Phone指数(Phone exponent), 他是一个正实数, p越大, 高光范围越小

计算反射角

已知向上的法向量n和光线l, 计算反射角r

注意: shader 中有reflect函数, 可以帮助直接计算反射角

无法复制加载中的内容

Blinn-Phone光照模型

无法复制加载中的内容

L: light

N: normal

H: half

E: eye

基于Phone模型, 不需要检查点积为负的情况

它计算向量l和e之间的半角向量h, 而不是r向量

优化Phone模型公式为Blinn-Phone

这里的指数p有和Phone模型中的指数p有相似的作用, 但是h和n之间的角度ω和r和n之间的角度σ不同, 所以细节上, 有稍微的差别

优缺点

优点

使用n和h之间的余弦, 当眼睛和光线都在平面上的时候, 该角度永远是正的

缺点

计算h需要一次平方根和一次除法运算

整合光照

在实际的使用过程中, 除了高光, 大部分材质也拥有漫反射的效果

合并朗伯模型和Blinn-Phone模型

漫反射朗伯模型

高光Blinn-Phone模型

控制减弱高光

如果希望能减弱高光, 可以再增加一个控制选项Cp, 同样为三个颜色的分量, 取值范围为[0-1]

Cr 漫反射系数

Ca 环境光

Cl 光线强度

P 高光Phone指数