首页 > 代码库 > Unity shader学习之逐像素漫反射光照模型

Unity shader学习之逐像素漫反射光照模型

shader如下:

Shader "Custom/Diffuse Fragment-Level"
{
    Properties
    {
        _Diffuse ("Diffuse", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags { "LightMode"="ForwardBase" }        // 只有设置了正确的LightMode,才能访问一些Unity提供的内置变量,如:_LightColor0

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

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

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float3 worldNormal : NORMAL;
            };

            float4 _Diffuse;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                float3 wn = mul(v.normal, (float3x3)_World2Object);
                o.worldNormal = normalize(wn);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                float3 lightDir = normalize(_WorldSpaceLightPos0);
                float4 diffuseColor = _Diffuse * _LightColor0 * max(0, dot(lightDir, i.worldNormal));
                return UNITY_LIGHTMODEL_AMBIENT + diffuseColor;
            }

            ENDCG
        }
    }

    Fallback "Diffuse"
}

 

效果如下:

技术分享

 转载请注明出处:http://www.cnblogs.com/jietian331/p/7079005.html

逐像素光照可以得到更新平滑的光照效果,但有一个缺点,在光照无法到达的区域,模型的外观通常是全黑的,没有任何明暗变化,像一个平面一样,无任何模型细节表现,如下图。

技术分享

为此,有一种改善技术:半兰伯特(Half Lambert)光照模型

Unity shader学习之逐像素漫反射光照模型