欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何在 Unity 中实现漫反射照明模型

最编程 2024-04-04 13:19:06
...

我正在参加「掘金·启航计划」

前言

我们知道,在计算机图形学中,标准光照模型将光照大致分为四个部分:自发光、高光反射、漫反射、环境光。本篇将会使用UNITY游戏引擎来实现标准光照模型中漫反射部分。

关于漫反射

漫反射反应了物体表面被光源照射之后随机散射到各个方向的辐射度,这里的随机我们可以理解为在各个方向上都是均匀的即可。那么如何使用数学来对漫反射进行建模呢?这里就需要用到兰伯特定律:反射光线的强度与物体表面法线和光源的之间夹角的余弦值成正比。

兰伯特.png

在Unity中的具体步骤

  • 1、在Project面板右键创建一个Unlit Shader,将其命名为Lambert。

image-20221030090202305.png

  • 2、选中刚刚创建的Shader,右键新建一个Material,保持默认名字即可。

image-20221030090446767.png

  • 3、在Hierarchy面板新建一个Shpere,并将第二步中创建的材质球赋给Shpere。

image-20221030090634506.png

  • 4、使用脚本IDE打开第一步创建的Shader,添加代码如下:
Shader "Unlit/Lambert"
{
    Properties
    {
       
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float3 nDirWS : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.nDirWS = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //获取光照方向
                float3 lightDir = _WorldSpaceLightPos0.xyz;
                half lambert = max(0.0,dot(i.nDirWS,lightDir));
                return fixed4(lambert,lambert,lambert,1.0);
            }
            ENDCG
        }
    }
}
  • 5、查看效果。

image-20221030091650839.png

最后

本篇使用Unity引擎来表现漫反射的效果,大家也可以使用其他的引擎进行实现,原理都是一样的,OK,本篇就到这里。