15.Phong光照模型必备知识点

15.光照模型-综合光照模型-Phong光照模型-必备知识点


15.1 知识点

两个颜色相加

  • 在学习兰伯特光照模型时,我们了解到两个颜色相乘的概念。它的作用是将两个颜色叠加在一起,通过各自的RGBA值相乘得到一个新的颜色。

  • 两个颜色相加和两个颜色相乘的区别:

    • 颜色相乘的效果是最终颜色会往黑色靠拢。当我们在计算两个颜色混合时,通常使用颜色相乘,因为在现实世界中,多个颜色混合后会趋向黑色。
    • 颜色相加的效果是最终颜色会往白色靠拢。在计算光照反射时,通常使用颜色相加,因为颜色向白色靠拢会带来更亮的视觉效果,更符合光线的表现。

Unity Shader中的环境光

在学习兰伯特和半兰伯特光照模型时,我们在计算完漫反射光照后,添加了一个环境光变量 UNITY_LIGHTMODEL_AMBIENT。其实,这个环境光变量是可以在Unity中进行设置的。

  • 设置环境光方法
    • 在Unity中,打开菜单:Window -> Rendering -> Lighting
    • 在Environment(环境)页签中,找到Environment Lighting(环境光)设置。
    • 你可以在这里选择环境光的来源:
      • 如果选择SkyboxColor,我们可以通过UNITY_LIGHTMODEL_AMBIENT获取到对应的环境光颜色。
      • 如果选择Gradient(渐变),我们可以通过以下三个成员变量得到相应的环境光:
        • unity_AmbientSky(天空环境光)
        • unity_AmbientEquator(赤道环境光)
        • unity_AmbientGround(地面环境光)


注意:这些内置变量都包含在 UnityShaderVariables.cginc 文件中,在编译时自动包含,无需手动引入。

Phong光照模型的来历和原理

来历
Phong光照模型由裴祥风(Bui-Tuong Phong,越南裔美国计算机学家)提出于1975年。这是一种局部光照经验模型,旨在更好地模拟光照效果。

原理
裴祥风认为物体表面的反射光线是由三部分组成的:

  1. 环境光
  2. 漫反射光
  3. 镜面反射光(高光反射光)

Phong光照模型的公式

Phong光照模型的计算公式如下:

物体表面光照颜色 = 环境光颜色 + 漫反射光颜色 + 高光反射光颜色

其中:

  • 环境光颜色 = UNITY_LIGHTMODEL_AMBIENT(结合unity_AmbientSkyunity_AmbientEquatorunity_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

×

喜欢就点赞,疼爱就打赏