15.光照模型-综合光照模型-Phong光照模型-必备知识点
15.1 知识点
两个颜色相加
在学习兰伯特光照模型时,我们了解到两个颜色相乘的概念。它的作用是将两个颜色叠加在一起,通过各自的RGBA值相乘得到一个新的颜色。
两个颜色相加和两个颜色相乘的区别:
- 颜色相乘的效果是最终颜色会往黑色靠拢。当我们在计算两个颜色混合时,通常使用颜色相乘,因为在现实世界中,多个颜色混合后会趋向黑色。
- 颜色相加的效果是最终颜色会往白色靠拢。在计算光照反射时,通常使用颜色相加,因为颜色向白色靠拢会带来更亮的视觉效果,更符合光线的表现。

Unity Shader中的环境光
在学习兰伯特和半兰伯特光照模型时,我们在计算完漫反射光照后,添加了一个环境光变量 UNITY_LIGHTMODEL_AMBIENT。其实,这个环境光变量是可以在Unity中进行设置的。
- 设置环境光方法:
- 在Unity中,打开菜单:
Window -> Rendering -> Lighting。 - 在Environment(环境)页签中,找到
Environment Lighting(环境光)设置。 - 你可以在这里选择环境光的来源:
- 如果选择
Skybox或Color,我们可以通过UNITY_LIGHTMODEL_AMBIENT获取到对应的环境光颜色。 - 如果选择
Gradient(渐变),我们可以通过以下三个成员变量得到相应的环境光:unity_AmbientSky(天空环境光)unity_AmbientEquator(赤道环境光)unity_AmbientGround(地面环境光)
- 如果选择
- 在Unity中,打开菜单:


注意:这些内置变量都包含在 UnityShaderVariables.cginc 文件中,在编译时自动包含,无需手动引入。
Phong光照模型的来历和原理
来历:
Phong光照模型由裴祥风(Bui-Tuong Phong,越南裔美国计算机学家)提出于1975年。这是一种局部光照经验模型,旨在更好地模拟光照效果。
原理:
裴祥风认为物体表面的反射光线是由三部分组成的:
- 环境光
- 漫反射光
- 镜面反射光(高光反射光)
Phong光照模型的公式
Phong光照模型的计算公式如下:
物体表面光照颜色 = 环境光颜色 + 漫反射光颜色 + 高光反射光颜色
其中:
- 环境光颜色 =
UNITY_LIGHTMODEL_AMBIENT(结合unity_AmbientSky、unity_AmbientEquator、unity_AmbientGround) - 漫反射光颜色 = 兰伯特光照模型计算得到的颜色
- 高光反射光颜色 = Phong式高光反射光模型计算得到的颜色
总结
Phong光照模型最终公式:
物体表面光照颜色 = 环境光颜色 + 兰伯特光照模型所得颜色 + Phong式高光反射光模型所得颜色
15.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson15_光照模型_综合光照模型_Phong光照模型_必备知识点 : MonoBehaviour
{
void Start()
{
#region 知识点一 两个颜色相加
//我们在学习兰伯特光照模型时了解了两个颜色相乘
//它的作用是让两个颜色叠加在一起
//用两个颜色的RGBA值各自相乘得到一个新的颜色
//而两个颜色相加的作用 同样是让两个颜色叠加在一起
//它和两个颜色相乘的区别是:
//相乘: 颜色相乘时,最终颜色会往黑色靠拢
// 计算两个颜色混合时一般用颜色相乘
// 因为真实世界中多个颜色混在一起最终会变成黑色
//相加: 颜色相加时,最终颜色会往白色靠拢
// 计算光照反射时一般用颜色相加,因为向白色靠拢能带来 更亮的感觉,复合光的表现
#endregion
#region 知识点二 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 中
//在编译时,会自动包含该文件,可以不用手动包含
#endregion
#region 知识点三 Phong光照模型的来历和原理
//来历:
//Phong光照模型我们之前提到过
//它是由裴祥风(Bui-Tuong Phong,越南裔美国计算机学家)
//在1975年时,提出的一种局部光照经验模型
//原理:
//裴祥风认为物体表面反射光线是由三部分组成的
//环境光 + 漫反射光 + 镜面反射光(高光反射光)
#endregion
#region 知识点四 Phong光照模型的公式
//Phong光照模型公式:
//物体表面光照颜色 = 环境光颜色 + 漫反射光颜色 + 高光反射光颜色
//其中:
//环境光颜色 = UNITY_LIGHTMODEL_AMBIENT(unity_AmbientSky、unity_AmbientEquator、unity_AmbientGround)
//漫反射光颜色 = 兰伯特光照模型 计算得到的颜色
//高光反射光颜色 = Phong式高光反射光照模型 计算得到的颜色
#endregion
#region 总结
//Phong光照模型公式:
//物体表面光照颜色 = 环境光颜色 + 兰伯特光照模型所得颜色 + Phong式高光反射光照模型所得颜色
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com