【Unity】ShaderLab-2_2-基础光照模型-漫反射

漫反射 ShaderLab 实现

- 逐顶点漫反射 兰伯特模型

- 逐像素漫反射 兰伯特模型

- 逐像素漫反射 半兰伯特模型

/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 :   逐顶点漫反射 兰伯特模型
**/

Shader "Quaye/_DiffuseVertexLevel"
{
    Properties
    {
        _Diffuse("Diffuse",Color) = (1,1,1,1)
    }
    SubShader
    {
        pass
        {
            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM
            #pragma vertex      vert
            #pragma fragment    frag

            #include "Lighting.cginc"

            fixed4 _Diffuse;
            struct a2v      
            {
                float4 pos      : POSITION;
                float3 normal   : NORMAL;
            };
            struct v2f      
            {
                float4 pos      : SV_POSITION;
                fixed3 color    : COLOR;
            };


            // 兰伯特模型公式
            //  C_diffuse = (C_light*M_diffuse)*max(0,dot(n,l))
            //
            //  C_light     :   _LightColor0        (Unity内置光源的颜色和强度信息)
            //  M_diffuse   :   _Diffuse            (漫反射颜色)
            //  n           :   来自v.normal变换    (v.normal 转到世界空间得到)
            //  l           :   _WorldSpaceLightPos0(Unity内置光源的光源方向)
            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);

                fixed3 worldNormal  = normalize(mul(unity_ObjectToWorld, v.normal));
                fixed3 worldLight   = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse      = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLight));
                
                fixed3 ambient      = UNITY_LIGHTMODEL_AMBIENT.xyz;
                o.color = ambient + diffuse ;
                return o;
            }
            float4 frag(v2f i) :SV_Target
            {
                return fixed4 (i.color,1.0);
            }
            ENDCG
        }
    }
}





/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 :   逐像素漫反射 兰伯特模型
**/

Shader "Quaye/_DiffusePixelLevel"
{
    Properties
    {
        _Diffuse("_Diffuse",Color) = (1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        Tags{"LightMode" = "ForwardBase"}

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"

            fixed3  _Diffuse;

            struct a2v
            {
                float4 pos      :   POSITION;
                float3 normal   :   NORMAL;
            };
            struct v2f
            {
                float4 pos          :   SV_POSITION;
                float3 worldNormal  : TEXCOORD0;
            };

            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);
                o.worldNormal =normalize( mul(unity_ObjectToWorld, v.normal));
                return o;
            }

            // 漫反射兰伯特模型 
            //  C_diffuse = (C_light*M_diffuse)*max(0,dot(n,l))
            fixed4 frag(v2f i)  :   SV_Target
            {
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal,worldLightDir));
                return fixed4 (ambient + diffuse,1.0);
            }
            ENDCG
        }
    }
}





/**********
*
* 作者 : Quaye
* 时间 : 2018.05.29
*
* 描述 :   逐像素漫反射 半兰伯特模型
**/

Shader "Quaye/_DiffusePixelLevel_half"
{
    Properties
    {
        _Diffuse("_Diffuse",Color) = (1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        Tags{"LightMode" = "ForwardBase"}

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"

            fixed3  _Diffuse;

            struct a2v
            {
                float4 pos      :   POSITION;
                float3 normal   :   NORMAL;
            };
            struct v2f
            {
                float4 pos          :   SV_POSITION;
                float3 worldNormal  : TEXCOORD0;
            };

            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);
                o.worldNormal =normalize( mul(unity_ObjectToWorld, v.normal));
                return o;
            }

            // 半兰伯特模型   
            //  C_diffuse = (C_light*M_diffuse)*(0.5*dot(n,l)+0.5)
            fixed4 frag(v2f i)  :   SV_Target
            {
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(i.worldNormal,worldLightDir)+0.5);
                return fixed4 (ambient + diffuse,1.0);
            }
            ENDCG
        }
    }
}







猜你喜欢

转载自blog.csdn.net/qq_33479009/article/details/80518398