US3S1L2——兰伯特光照模型

本章代码关键字

1
2
UNITY_LIGHTMODEL_AMBIENT        //兰伯特光照模型环境光变量,对计算出来的结果加上该变量、用于模拟环境光对物体的影响,避免物体阴影部分完全黑暗
​_WorldSpaceLightPos0​ //表示光源0在世界坐标系下的位置

兰伯特光照模型

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

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

两个颜色相乘

两个颜色变量相乘,通常用于计算光照、材质混合、纹理混合等等需求
它是一种用于混合颜色的操作,计算结果可以理解为两种颜色叠加在一起的效果
在颜色相乘中,通常是使用颜色通道的值来执行逐通道的乘法

举例:颜色A、B都是 fixed4​ 类型的变量
颜色A * 颜色B = (A.r * B.r, A.g * B.g, A.b * B.b, A.a * B.a);
那么得到的这个结果就是A、B颜色叠加后的结果

总结:两个颜色变量相乘,得到的结果表示两个颜色叠加在一起

漫反射基本概念

漫反射(Diffuse Reflection)是光线撞击一个物体表面后以各个方向均匀地反射出去的过程
在漫反射下,光线以无规律的方式散射,而不像镜面反射那样按照特定的角度反射。
这种散射导致了物体表面看起来均匀而不闪烁的效果。

image

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

兰伯特 (Lambert) 光照模型,也称为朗伯反射模型
是由瑞士数学家约翰·海因里希·朗伯(Johann Heinrich Lambert)于1760年左右首次提出
朗伯是18世纪的一个杰出科学家,他在光学和数学领域作出了众多贡献。
兰伯特光照模型描述了漫反射表面对光线的反射行为,它成为计算机图形学和渲染中重要的基础模型之一

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

假设:
入射光线的光强度为 LL
入射光线和某顶点法线的夹角为 θ\theta
则反射光线的强度为:LcosθL\cos\theta

image

也就是说,在兰伯特光照模型中,光源射向表面的光线越接近于法线,反射光线的强度越大,越接近于 LL ,即 θ\theta 越小,cosθ\cos\theta 越大,反射光线强度越大

兰伯特光照模型的公式

公式:

漫反射光照颜色=光源的颜色×材质的漫反射颜色×max(0, 标准化后物体表面法线向量标准化后光源方向向量)漫反射光照颜色 = 光源的颜色 \times 材质的漫反射颜色 \times \max(0,\ 标准化后物体表面法线向量\cdot标准化后光源方向向量)

其中:

  1. 标准化后物体表面法线向量标准化后光源方向向量标准化后物体表面法线向量 \cdot 标准化后光源方向向量注意,这里是向量点乘),得到的结果就是 cosθ\cos\theta
  2. max(0,cosθ)\max(0, \cos\theta) 的目的是避免负数,对于模型背面的部分,认为找不到光,直接乘以0,变为黑色

如何在Shader中获取公式中的关键信息

  1. 光源的颜色

    ​Lighting.cginc​ 内置文件中的 _LightColor0​

  2. 光源的方向

    _WorldSpaceLightPos0​ 表示光源0在世界坐标系下的位置

    对于光源的方向,存在两种计算方式,详见下文计算光照的两种方式

  3. 向量归一化(标准化)方法 normalize()

  4. 取最大值方法 max(,)

  5. 点乘方法 dot(,)

  6. 兰伯特光照模型环境光变量(用于模拟环境光对物体的影响,避免物体阴影部分完全黑暗)

    UNITY_LIGHTMODEL_AMBIENT.rgb

  7. 将法线从模型空间转换到世界空间 UnityObjectToWorldNormal​

关于光照方向的计算方式

计算光照存在两种方式:

  1. 模拟定向光源

    直接得到 _WorldSpaceLightPos0​ 光照位置 作为光照方向,
    表示光线是平行的,而不是从特定点发射
    一般模拟太阳光效果 采用这种方式

  2. 模拟点光源

    用光照位置 _WorldSpaceLightPos0​ 减去 顶点坐标,
    表示光线是从特定点发射的,并朝着顶点方向
    一般定点光源 采用这种方式

因为一般 Unity 场景的默认的一个光源都是模拟太阳的环境光,
因此,接下来的例子都是基于第一种方式获取的

兰伯特光照模型的实现

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