逐顶点光照模型

//漫反射 Diffuse = 直射光颜色 * saturate(cos夹角(光和法线的夹角))

Shader "Custom/Diffuse Vertex" {

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

            CGPROGRAM
            #include "Lighting.cginc"
            //第一个直射光的颜色:_LightColor0
            //第一个直射光的位置:_WorldSpaceLightPos0
            #pragma vertex vert
            #pragma fragment frag

            struct a2v {
                float4 vertex:POSITION;//告诉Unity把模型空间下的顶点坐标填充给vertex
                float3 normal:NORMAL;//法线(模型空间)
            };

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

            //顶点函数
            v2f vert(a2v v) {
                v2f o;
                o.position = mul(UNITY_MATRIX_MVP, v.vertex);//UNITY_MATRIX_MVP:这个矩阵把一个坐标从模型空间转换到剪裁空间

                //计算法线方向
                //mul(_World2Object, v.normal);//_World2Object:这个矩阵用来把一个方向从世界空间转到模型空间,4x4矩阵
                fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));//换一下顺序为把模型空间转到世界空间

                //计算光的方向
                fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

                fixed3 diffuse = _LightColor0.rgb * saturate(dot(normalDir, lightDir) *0.5+0.5);//使用半兰伯特光照模型

                //取得环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
                o.color =  diffuse +ambient; 
                return o;
            }

            //片元函数
            fixed4 frag(v2f f) :SV_Target{
                return fixed4(f.color,1);
            }

            ENDCG
        }
    }
    FallBack "Diffuse"
}

你可能感兴趣的:(逐顶点光照模型)