US3S1L4——Phong式高光反射光照模型

本章代码关键字

1
2
3
​_WorldSpaceCameraPos​    //观察者的位置(摄像机的位置)
UNITY_MATRIX_M //从模型空间转换到世界空间的矩阵,在这里用于将模型顶点从模型空间转换到世界空间参与计算
unity_ObjectToWorld //同样是从模型空间转换到世界空间的矩阵,与上面的等价的,在这里用于将模型顶点从模型空间转换到世界空间参与计算

Phong式高光反射光照模型

来历:高光反射光照模型没有单一的发明者,因为有多种计算的方式
和半兰伯特光照模型一样,是经过很多从业者的研究和发展而演化出来的

其中比较关键的几位贡献者为

  • Phong光照模型的提出者:裴祥风(Bui-Tuong Phong,越南裔美国计算机学家)
  • Blinn-Phone光照模型的提出者:吉姆·布林(Jim Blinn,美国计算机科学家)

原理:Phong式高光反射光照模型的理论是:
基于光的反射行为和观察者的位置决定高光反射的表现效果
认为高光反射的颜色和光源的反射光线以及观察者位置方向向量夹角的 cos\cos 值成正比
并且通过对余弦值取n次幂来表示光泽度(或反光度)

image

指的一提的是,Phong式高光反射模型不会单独使用,单独使用会得到一个黑色的带高光的高光效果,这和我们实际期望的光照效果不匹配

image

我们会在后面的Phong式光照模型中,和兰伯特光照模型一起使用,得到最终的光照效果

Phong式高光反射光照模型的公式

公式:

高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后观察方向向量标准化后的反射方向)光泽度高光反射光照颜色 = 光源的颜色 \times 材质高光反射颜色 \times \max(0,\ \overrightarrow{标准化后观察方向向量} \cdot \overrightarrow{标准化后的反射方向})^{光泽度}

  1. 标准化后观察方向向量标准化后的反射方向\overrightarrow{标准化后观察方向向量} \cdot \overrightarrow{标准化后的反射方向} 得到的结果就是 cosθ\cos\theta
  2. 光泽度是幂运算,假设光泽度为 nn,相当于:(max(0,cosθ))n(max(0,\cos\theta))^n

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

  1. 观察者的位置(摄像机的位置):_WorldSpaceCameraPos
  2. 相对于法向量的反射向量 方法:reflect(入射向量, 顶点法向量)​ 返回反射向量
  3. 指数幂 方法:pow(底数, 指数)​ 返回计算结果

其他关键信息获取方式和兰伯特光照模型差不多,参考:如何在Shader中获取公式中的关键信息

Phong式高光反射模型的实现

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