URP | Phong 和 Blinn-Phong光照光照模型
Phong | 冯氏光照模型
介绍
Phong光照模型中主要的部分就是对高光的计算
是根据反射原理,如果正好在反射方向观察,那看到的反射光就越多。所以计算反射方向和观察方向。就可以计算出高光反射。
公式
I(spcular) = pow(max(0,dot(R,V)), gloss)
最终颜色 = 直射光颜色 * 反射光颜色 * pow(max(0, dot(反射光方向, 视野方向)), 光泽度(gloss)
Phong光照模型原理
简单介绍一下,兰伯特光照模型,已经获取到了法线向量(N),光照向量(L),
Phong 光照模型 是计算观察方向(V)和反射方向(R) 这俩个向量。计算出高光的强弱。

HLSL 怎么求出这俩个向量,
V 视角
获取相机的世界坐标(_WorldSpaceCameraPos )这个宏是内置的,
使用相机空间的位置信息 —世界空间顶点位置信息 = 就可以得到相机方向。
这一步是在顶点阶段计算的,不要忘记片元结构体里申明变量。
注意 :是float3类型的向量,不要错误。
在片元着色器阶段计算
片元着色器
传入数据归一化一下,
注意 :是float3类型的向量,不要错误。
R 反射
那怎么计算反射向量,我们可以使用光的反方向,和顶点法线方向求出反射方向。
注意 :是float3类型的向量,不要错误。
这里的 -LightDir 是负的方向。
高光计算部分
套用公式带入,后面 乘光照颜色。
效果

代码
Blinn-Phong光照
半角向量 | Halfway vector
Blinn-Phong光照引入了一个概念,半角向量,用H表示. 它在视线方向和光线方向的中间

H 半角向量
怎么获取半角向量,使用视角 + 光照方向
高光计算
使用 dot(N,H)
俩个效果对比

总结
Phong 光照模型 主要是计算出 视角方向(ViewDir)和反射方向(ReflectDir),视角方向最好在顶点阶段计算,这样会少很多计算量,向量传入片元着色器阶段归一化一下。

注意:向量的类型,一开始我是设置 real 类型,在反射方向,计算出一个错误的结果。查找了半天。

我们修改成 real3类型,在看一下效果。

Blinn-Phone 光照模型,是在Phone基础上修改的,
Blinn-Phong着色的一个附加好处是,它比Phong着色性能更高,因为我们不必计算更加复杂的反射向量