镜面高光

1.求出入射光向量
2.顶点法线向量
3.根据CG函数求出 反射光
4.反射光与视向量点积 求出镜面高光的系数 乘以对应颜色值

Shader "Custom/test1" {

    properties
    {
        _SpecularColor("SpecularColor",color)=(1,1,1,1)
        _shininess("shininess",range(4,64)) = 8
    }
    SubShader {
        pass
        {

            Tags{"LightMode"="ForwardBase"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag 

            #include "unitycg.cginc"
            #include "lighting.cginc"

            float4 _SpecularColor;
            float _shininess;
            struct v2f{
                float4 pos:POSITION;
                fixed4 col:COLOR;
            };


            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);

                float3 N = normalize(v.normal);
                float3 L = normalize(_WorldSpaceLightPos0);

                N = mul(float4(N,0),_World2Object).xyz;
                N = normalize(N);

                //漫反射
                float ndot =pow(saturate(dot(L,N)),_shininess);

                //环境光
                o.col = _LightColor0*ndot+UNITY_LIGHTMODEL_AMBIENT;

                //镜面高光
                //1.求出入射光
                float3 I = -WorldSpaceLightDir(v.vertex);

                //2.求出法线
                float3 wN = UnityObjectToWorldNormal(v.normal);

                //3.计算反射
                float3  R = reflect(I,wN);

                //4.计算视向量
                float3 V = WorldSpaceViewDir(v.vertex);

                //5.归一求点积
                R = normalize(R);
                V = normalize(V);

                float specularScale = saturate(dot(R,V));

                o.col+=_SpecularColor*specularScale;

                return o;
            }

            fixed4 frag(v2f IN):COLOR
            {
                //光照计算放在片段程序中,交接顶点会变得比较平滑
                return IN.col;
            }
            ENDCG
        }
    }

}

你可能感兴趣的:(unity3d)