该文主要来源于《Unity Shader入门精要》,做了一些修改和加入了一些补充信息
光的一些基本原理
光线从光源发射出来,与一些物体相交,有一部分光线被物体吸收,另一部分则被散射到其他方向。最后,摄像机吸收了一些光,产生了一张图像。
光的属性
假设光源方向为L,表面法线为N,光线照射到表面之前的距离d
辐照度(irradiance):垂直于L的单位面积上单位时间穿过的能量,我们可以利用L和N的夹角余弦值来得到。(物体表面的光线之间的距离等于d/cos(L,N),辐照度与这个值成反比,也就是说辐照度与cos(L,N)成正比)
高光反射(specular):表示物体表面如何反射光线
漫反射(diffuse):表示有多少光线会被吸收,散射出表面
出射度(exitance):出射光线的数量和方向,辐照度和出射度符合线性关系,而他们的比值就是材质的漫反射和高光反射属性
着色
根据物体的材质属性(如漫反射属性)、光源信息(如光源方向、辐照度),使用一个等式去计算沿某个观察方向的出射度的过程。
这个等式也被称为光照模型(Ligthing Model)
标准光照模型 Blinn-Phong模型
标准光照模型只关心直接光照,也就是哪些从光源发射出来照射到物体表面只经过物体表面的一次反射直接进入摄像机的光线。
它把进入到摄像机内的光线分为四部分
- 自发光(emissive),给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照技术,这些自发光表面并不会真的照亮周围的物体,只是本身看起来更亮了而已。
- 高光反射(specular),当光线从光源照射到表面时,该表面会在完全镜面反射方向散射多少辐射量。高光反射需要4个参数:入射光线的颜色和强度,材质高光反射系数,视角方向,反射方向,反射方向可以由光源方向L,表面法线N计算得出,CG提供了计算反射方向的函数reflect(L,N)。
- Phong高光反射等式:
- Blinn-Phong高光反射等式:
- 没有使用反射方向而是引入新的矢量h,通过对视角方向和光照方向的归一化得到。
- 漫反射(diffuse),当光线从光源照射到表面时,该表面会向每个方向散射多少辐射量。符合lambert定律,也就是说反射光线的强度与表面法线和光源方向之间的余弦值成正比。因此漫反射部分计算max(0,dot(L,N));,截取到0是为了避免背面光强度成为负数,再被后面的光源照亮时依然不大于0,没有光,也可以用saturate(dot(L,N))截取0-1。半lambert着色,不使用max来避免为负数,而是*0.5再+0.5,将-1,1的值映射到0,1,并没有物理依据,只是一个视觉增强技术。
- 漫反射等式:
- 环境光(ambient),描述所有其他间接光照,通常是一个全局变量,场