US3S1L3——半兰伯特光照模型

半兰伯特光照模型

半兰伯特光照模型 是 基于兰伯特光照模型进行的修改,主要目的是让背光面可以有明暗变化:

Color漫反射光照=Color光源×Color材质的漫反射×((标准化后物体表面法线向量标准化后光源方向向量)×0.5+0.5)Color_{漫反射光照} = Color_{光源} \times Color_{材质的漫反射} \times ((\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量}) \times 0.5 + 0.5)

单位向量点乘的结果范围

根据数学公式我们知道,假设单位向量A和单位向量B,它们的点乘结果为:

AB=ABcosθ\vec{A} \cdot \vec{B} = |\vec{A}||\vec{B}|\cos\theta

cosθ\cos\theta 的范围在 -1 到 1 之间(夹角为0度时,点乘结果为1;当夹角为180度时,点乘结果为-1)
因此单位向量进行点乘时,它们的结果是 -1 ~ 1

关于兰伯特光照公式:

Color漫反射光=Color光源×Color材质的漫反射×max(0,标准化后物体表面法线向量标准化后光源方向向量)Color_{漫反射光}=Color_{光源} \times Color_{材质的漫反射} \times \max(0,\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量})

其中,标准化后物体表面法线向量标准化后光源方向向量\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量} 等于物体表面法线与光源方向向量的夹角的 cos\cos

当物体表面法线与光源方向向量的夹角大于90度时,cos\cos 值会小于0,公式计算结果会归0,
所以兰伯特光照模型直接使用会使背光面完全变为黑色(不使用其他手段的情况下)

image

半兰伯特光照模型的来历和原理

半兰伯特光照模型是基于 兰伯特光照模型 的基础上进行改进的
它没有任何物理依据,只是一个视觉加强技术
它出现的主要原因是因为我们在使用兰伯特光照模型时,在背光面是全黑的
半兰伯特光照模型可以让背光面也可以有明暗变化

半兰伯特光照模型没有特定的发明者,它是图形学领域的众多研究人员共同的贡献
研究人员们经常相互借鉴和改进现有的模型,以更好地模拟真实世界中的光照和材质反射

原理,和兰伯特光照模型的理论是一样的:
认为漫反射光的强度仅与入射光的方向和反射点处表面法线的夹角的余弦成正比

半兰伯特光照模型的公式

公式:

漫反射光照颜色=光源的颜色×材质的漫反射颜色×((标准化后物体表面法线向量标准化后光源方向向量)×0.5+0.5)漫反射光照颜色 = 光源的颜色 \times 材质的漫反射颜色 \times ((\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量}) \times 0.5 + 0.5)

对比:

  • 兰伯特光照模型的 后半部分:

    max(0,标准化后物体表面法线向量标准化后光源方向向量)\max(0,\overrightarrow{标准化后物体表面法线向量} \cdot \overrightarrow{标准化后光源方向向量})

    点乘小于0的部分都会变成0

  • 半兰伯特光照模型的 后半部分:

    ((标准化后物体表面法线向量标准化后光源方向向量)×0.5+0.5)((标准化后物体表面法线向量 \cdot 标准化后光源方向向量) \times 0.5 + 0.5)

    点乘小于 0 的部分都会变成 0~0.5,因此原本的单位向量点乘的结果范围 -1~1 映射到了 0~1,而不是将小于0的部分直接丢弃

半兰伯特光照模型的实现

  • 逐顶点光照
  • 逐片元光照