文章目录
- 前言
- 一、回顾Blinn-Phong光照模型
- 1、Blinn-Phong模型:
- 二、URP下的SimpleLit的 BlinnPhong
- 1、输入参数
- 2、程序体计算
前言
在上篇文章中,我们分析了 URP下的SimpleLit的 Lambert漫反射计算。
- Unity中URP下的SimpleLit的 Lambert漫反射计算
我们在这篇文章中,进行 URP下的SimpleLit的 BlinnPhone 高光反射计算的分析。
一、回顾Blinn-Phong光照模型
- 在BRP下,我们进行过Blinn-Phong高光反射的推导和实现.
- Unity中Shader光照模型Blinn-Phong原理及实现
1、Blinn-Phong模型:
Specular = SpecularColor * Ks * pow(max(0,dot(N,H)),Shininess)
- Specular:高光反射的最终颜色
- SpecularColor:高光反射颜色
- Ks:反射系数
- N:顶点法向量
- H:入射光线L 和 视线向量V的半角向量
- Shininess:高光指数,用于模拟高光的范围
二、URP下的SimpleLit的 BlinnPhong
1、输入参数
- lightColor:主光颜色
- lightDir:主光方向
- normal:法线信息
- viewDir:视线方向向量
以上这些,我们在之前的步骤中,已经分析过了
我们主要看 specular 和 smoothness
- specular:高光颜色
- smoothness:光滑度
- 这两个颜色都是在 初始化 SurfaceData 中完成的
- SampleSpecularSmoothness
首先:对specularSmoothness进行了初始化
然后:如果赋予了高光纹理,则进行高光纹理的采样,赋值给specularSmoothness
否则:将 高光 颜色赋予specularSmoothness
最后:按 alpha 的来源给 specularSmoothness.a 赋值
这个 a 经过处理后就是smoothness
half smoothness = exp2(10 * surfaceData.smoothness + 1);
- 该处理扩大了,smoothness 的变化率,并且使其在[0,1]之间,从1开始
2、程序体计算
- 先计算出 L 和 V 的半角向量
float3 halfVec = SafeNormalize(float3(lightDir) + float3(viewDir));
- 再计算出法线和半角向量的点积
half NdotH = half(saturate(dot(normal, halfVec)));
- 使用 smoothness 调节高光的范围
half modifier = pow(NdotH, smoothness);
- 混合高光颜色
half3 specularReflection = specular.rgb * modifier;
- 混合主光颜色
return lightColor * specularReflection;