UnityShader

【Unity Shader入门精要学习】Unity中的基础光照(

2019-08-24  本文已影响0人  小王子称号发放NPC

漫反射

lambert

Lambert

1、逐顶点

Shader "Unlit/Lambert"
{
    Properties
    {
        _Diffuse("Diffuse",Color) = (1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        Pass
        {
            Tags {"LightModel" = "ForwardBase"}

            CGPROGRAM
            
            #include "Lighting.cginc"

            #pragma vertex vert
            #pragma fragment frag

            fixed4 _Diffuse;

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

            struct v2f
            {
                float4 pos:SV_POSITION;
                fixed3 color:COLOR;
            };

            v2f vert(a2v v)
            {
                v2f o;
                //mul(UNITY_MATRIX_MVP,v.vertex);
                o.pos = UnityObjectToClipPos(v.vertex);

                //获取环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                //首先把顶点法线转换到世界坐标系下,在世界坐标系下进行计算
                //转换法线的矩阵是原矩阵的逆转置矩阵
                //将矩阵放在mul的第二个参数相当于对这个矩阵做了一次转置运算
                float3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));

                //获取世界坐标系下的光源方向
                //这里只假设场景中只有一个光源且是平行光
                float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);

                //在同一坐标系下做点乘运算
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0,dot(worldNormal,lightDirection));
                o.color = ambient + diffuse;
                return o; 
            }

            fixed4 frag(v2f f):SV_TARGET
            {
                return fixed4(f.color,1.0);
            }

            ENDCG
        }
    }
}

2、逐像素

Shader "Unlit/Lambert-Pixel"
{
    Properties
    {
        _Diffuse("Diffuse",Color) = (1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        pass
        {
            Tags{ "LightModel" = "ForwardBase" }
            
            CGPROGRAM
            #include "Lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag

            fixed4 _Diffuse;

            struct a2v
            {
                float4 pos:POSITION;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 worldNormal:TEXCOORD0;
            };

            v2f vert(a2v a)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(a.pos);
                o.worldNormal = mul(a.normal,(float3x3)unity_WorldToObject);

                return o;
            }

            fixed4 frag(v2f v):SV_TARGET
            {
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                float3 worldNormal = normalize(v.worldNormal);
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);

                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0,dot(worldNormal,worldLightDir));
                fixed3 finalColor = ambient + diffuse; 

                return fixed4(finalColor,1.0);
            }

            ENDCG
        }
    }
}

Half Lambert

Half-Lambert

1、逐顶点

Shader "Unlit/Half-Lambert-Vertex"
{
   Properties
   {
       _Diffuse("Diffuse",Color) = (1.0,1.0,1.0,1.0)
   }

   SubShader
   {
       pass
       {
           Tags {"LightModel"="ForwardBase"}
           CGPROGRAM
           
           #include "Lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag

            fixed4 _Diffuse;

            struct a2v
            {
                float4 pos:POSITION;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float4 clipPos:SV_POSITION;
                fixed3 color:COLOR;
            };
            
            v2f vert(a2v a)
            {
                v2f o;
                o.clipPos = UnityObjectToClipPos(a.pos);

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                float3 worldNormal = normalize(mul(a.normal,(float3x3)unity_WorldToObject));
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);

                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(worldNormal,worldLightDir)+0.5);

                o.color = ambient + diffuse;

                return o;
            }

            fixed4 frag(v2f v):SV_TARGET
            {
                return fixed4(v.color,1.0);
            }

           ENDCG
       }
   }
}

2、逐像素

Shader "Unlit/Half-Lambert-Pixel"
{
    Properties
    {
        _Diffuse("Diffuse",Color)=(1.0,1.0,1.0,1.0)
    }

    SubShader
    {
        Pass
        {
            Tags{"LightModel"="ForwardBase"}
            CGPROGRAM
            #include "Lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag

            fixed4 _Diffuse;

            struct a2v
            {
                float4 pos:POSITION;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float4 clipPos:SV_POSITION;
                float3 worldNormal:TEXCOORD0;
            };

            v2f vert(a2v a)
            {
                v2f o;
                o.clipPos = UnityObjectToClipPos(a.pos);
                o.worldNormal = mul(a.normal,(float3x3)unity_WorldToObject);

                return o;
            }

            fixed4 frag(v2f v):SV_TARGET
            {
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT;

                float3 normalizedWorldNormal = normalize(v.worldNormal);
                float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);

                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(normalizedWorldNormal,worldLightDir)+0.5);

                return fixed4(ambient+diffuse,1.0);
            }

            ENDCG
        }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读