一、前言
写高光的时候通常是使用Blinn-Phong模型,某日突然想起很久以前学习的Phong模型,拿两者出来比较学习一下
二、原理
两者都是传统的用于计算直接光镜面反射的传统经验模型,本质区别在于计算方式的不同
【Phong模型】RdotV
通过(光线的反射方向R与观测方向V)之间的夹角来描述镜面反射强度
由于需要求光线的反射方向R这么一个过程,耗能应该是相对来说较大的
【Blinn-Phong模型】NdotH
通过(法线N与半程向量H)之间的夹角来描述镜面反射强度
半程向量H:-入射光线L与观测方向V之间的角平分线(计算上,直接两向量相加就好了)
三、两者分别在Unity中的表现
使用smoothstep(min,max,x)函数控制范围/对比度
(smoothstep(min,max,x)参数相同的情况下)
左为【Phong模型】RdotV,右为【Blinn-Phong模型】NdotH
四、总结
对比来说,同样的数值下
【Blinn-Phong】与【Phong】相比:
- 受光面更大
- 过度更平滑
- 计算消耗更小
- 【Phong】更适合模拟塑料、玻璃、水、冰等高反光特性的介质
-【Blinn-Phong】大多适用于金属材质