Unity shader学习笔记 ——2.兰伯特光照模型(漫反射)

一,逐顶点光照(漫反射、自身颜色、环境光相互作用)

 Diffuse = 直射光颜色 * max( 0,cos夹角(光和法线的夹角)) cosθ = 光方向*法线方向

Shader "Custom/4 forth"
{   
    //Properties可以没有
    Properties
    {
        _Diffuse("Diffuse Color",Color)=(1,1,1,1)
    }
    SubShader
    {
         pass
        {
            Tags{"LightMode"="ForwardBase"}///添加tag
            CGPROGRAM 

            #include "Lighting.cginc"///引用光照 取得第一个直射光的颜色 _LightColor0
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Diffuse;

            struct a2v{
                float4 vertex:POSITION;

                ///取法线(模型空间下)
                float3 normal:NORMAL;
            };

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

            /顶点函数处理/
            //逐顶点光照
            v2f vert(a2v v)
            {
                v2f f;                
                f.position = UnityObjectToClipPos(v.vertex);

                 环境光获取
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

                ///_World2Object 将世界坐标换到模型坐标,作为第二个参数时,相反(将模型坐标换到世界坐标)
                / float3x3代表矩阵  此处强制转换4*4矩阵为3*3矩阵
                fixed3 normalDir =normalize(mul(v.normal,(float3x3) unity_WorldToObject));

                _WorldSpaceLightPos0 第一个直射光的位置,也就是光的方向
                normalize 把向量单位化,方向不变,长度变为一(世界空间下)
                fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                _LightColor0 第一个直射光的颜色
                fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0)*_Diffuse.rgb;//取得漫反射的颜色*颜色影响
                
                / 灯光之间相互叠加 直接+
                f.color = diffuse + ambient;

                return f;
            }
            
            fixed4 frag(v2f f) : SV_Target
            {
                return fixed4(f.color,1);
            }

            ENDCG
        }
        
    }
    FallBack "Diffuse"
}

二、逐像素光照

Shader "Custom/5 five"
{   
    //Properties可以没有
    Properties
    {
        _Diffuse("Diffuse Color",Color)=(1,1,1,1)
    }
    SubShader
    {
         pass
        {
            Tags{"LightMode"="ForwardBase"}///添加tag
            CGPROGRAM 

            #include "Lighting.cginc"///引用光照 取得第一个直射光的颜色 _LightColor0
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Diffuse;

            struct a2v{
                float4 vertex:POSITION;

                ///取法线(模型空间下)
                float3 normal:NORMAL;
            };

            struct v2f{
                float4 position:SV_POSITION;
                fixed3 Worldcolor:COLOR;
            };

            //逐像素光照
            v2f vert(a2v v)
            {
                v2f f;                
                f.position = UnityObjectToClipPos(v.vertex);

                f.Worldcolor = mul(v.normal,(float3x3) unity_WorldToObject);

                return f;
            }
            
            fixed4 frag(v2f f) : SV_Target
            {
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

                fixed3 normalDir =normalize(f.Worldcolor);

                fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                
                fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0)*_Diffuse.rgb;

                fixed3 tempcolor = diffuse + ambient;
                return fixed4(tempcolor,1);
            }

            ENDCG
        }
        
    }
    FallBack "Diffuse"
}

逐像素渲染比逐顶点效果更好,更圆滑,但是消耗比较大,每一个像素都要调用方法。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值