1.高光
2.Unity环境光
3.Phong光照模型
4.Blinn - Phong光照模型
1.高光
物体表面的反射除了漫反射, 还有高光反射; 观察者的位置对于高光反射很重要, 只有最终直接反射到自己身上的光才能被看见, 其余的地方, 不会看到高光; 因此我们需要物体表面到观察者的方向(顶点和相机的世界空间位置)

可以通过float3 _WorldSpaceCameraPos访问相机的位置

2.Unity环境光
unity环境光设置:Window - Rendering - Lighting - Environment - Environment Lighting

1).若环境光来源是Skybox和Color时, 可以通过UNITY_LIGHTMODE_AMEIENT获得环境光2).若环境光来源是Gradient(渐变)a.unity_Ambientsky 周围的天空环境光b.unity_AmbientEquator 周围的赤道环境光c.unity_AmbientGround 周围的地面环境光这些内置变量包含在UnityShaderVariables.cginc中
3.Phong光照模型
1).Phong光照模型中物体表面反射光线由三部分组成:环境光 + 漫反射光 + 高光2).Phong光照模型中, 高光的计算方式如下:光源的颜色 * 材质高光反射颜色 * pow(max(0, 视野方向 * 反射光方向), 光泽度)a.视野方向和反射光方向是单位向量

3).使用pow的原因对于镜面高光的直观感受, 一个微小的偏离就应该造成亮度的大幅度下降a.cos(θ)的曲线在θ = 0°附近变化平缓, 在θ = 90°附近变化剧烈- 当θ从0°增大到30°时, cos(θ)从1.0下降到0.87- 当θ从60°增大到90°时, cos(θ)从0.5急剧下降到 0.0b.pow(cos(θ), n)曲线在θ = 0°附近的导数(变化率)远远大于cos(θ), 这意味着视线只是产生了一个微小的偏移Δθ, pow(cos(θ), n)的下降量ΔI会比cos(θ)的下降量大得多得多

4).反射光通过标准函数reflect函数计算反射光的方向, 它采用入射光线的方向, 并根据表面法线进行反射, 因此我们需要取入射光线的反方向

5).Smoothness 平滑度Phong高光模型产生的高光大小取决于材料的粗糙程度, 光滑的材料可以更好地聚焦光线, 因此它们的高光通常较小; 可以将Smoothness设置为材料属性来控制平滑度, 它通常定义为0到1之间的值

通过pow和平滑度值来缩小高光范围, 平滑度值必须大于1才能得到所需的效果, 因此通过将它乘以100

6).Specular Color 镜面反射颜色高光反射的颜色取决于材质, 不同于反照率; 金属往往几乎没有反照率, 但是具有很强的镜面反射率; 非金属往往具有明显的反照率, 镜面反射率较弱; 因此我们可以添加纹理和色调来定义镜面反射颜色




4.Blinn - Phong光照模型
1).最常用的光照模型还是Blinn - Phong光照模型, 其光照模型为:环境光 + 漫反射光 + 高光2).Blinn - Phong中高光的计算时通过半角向量, 如下:高光反射颜色 = 光源颜色 * 材质高光反射颜色 * pow(max(0, 半角向量 * 法线向量), 光泽度)3).半角向量就是视野方向和光线方向角平分线的向量



