US3S1L5——Phong光照模型
US3S1L5——Phong光照模型
本章代码关键字
1 | UNITY_LIGHTMODEL_AMBIENT //当光面板的环境光光源选择天空盒或者固定颜色时,通过该变量获取环境光 |
Phong光照模型
Phong光照模型公式:
其中:
- 环境光颜色 =
UNITY_LIGHTMODEL_AMBIENT
(或者:unity_AmbientSky
、unity_AmbientEquator
、unity_AmbientGround
) - 漫反射光颜色 = 兰伯特光照模型 计算得到的颜色
- 高光反射光颜色 = Phong式高光反射光照模型 计算得到的颜色
两个颜色相加或相乘
我们在学习兰伯特光照模型时了解了两个颜色相乘
它的作用是让两个颜色叠加在一起,用两个颜色的RGBA值各自相乘得到一个新的颜色
而两个颜色相加的作用 同样是让两个颜色叠加在一起
它和两个颜色相乘的区别是:
-
相乘:颜色相乘时,最终颜色会往**黑色靠拢**
计算两个颜色混合时一般用颜色相乘,因为真实世界中 多个颜色颜料混在一起 或者 透明色板叠加叠加在一起 最终会变成黑色
-
相加:颜色相加时,最终颜色会往**白色靠拢**
计算光照反射时一般用颜色相加,因为向白色靠拢能带来更亮的感觉,符合混合不同色光的表现
Unity Shader中的环境光
我们在学习兰伯特和半兰伯特光照模型时
在计算完漫反射光照后,加上了一个环境光变量 UNITY_LIGHTMODEL_AMBIENT
那么这个环境光变量其实是可以在Unity的光面板中进行设置的
Window——>Rendering——>Lighting
Environment(环境) 页签中的 Environment Lighting(环境光)
这里可以设置环境光来源
当是 Skybox 和 Color 时,我们可以通过 UNITY_LIGHTMODEL_AMBIENT
获取到对应环境光颜色
当是 Gradient(渐变)时,通过以下3个成员可以得到对应的环境光
-
unity_AmbientSky
(周围的天空环境光) -
unity_AmbientEquator
(周围的赤道环境光) -
unity_AmbientGround
(周围的地面环境光)
注意:
这些内置变量都包含在 UnityShaderVariables.cginc 中
在编译时,会自动包含该文件,可以不用手动包含
Phong光照模型的来历和原理
来历:
Phong光照模型我们之前提到过,
它是由裴祥风(Bui-Tuong Phong,越南裔美国计算机学家)在1975年时,提出的一种局部光照经验模型
原理:裴祥风认为物体表面反射光线是由三部分组成的,也即:
环境光 + 漫反射光 + 镜面反射光(高光反射光)
Phong光照模型的公式
Phong光照模型公式:
其中:
- 环境光颜色 =
UNITY_LIGHTMODEL_AMBIENT
(或者:unity_AmbientSky
、unity_AmbientEquator
、unity_AmbientGround
) - 漫反射光颜色 = 兰伯特光照模型 计算得到的颜色
- 高光反射光颜色 = Phong式高光反射光照模型 计算得到的颜色
Phong式高光反射模型的实现
- 逐顶点光照
- 逐片元光照