镜面高光

来源:互联网 发布:淘宝达人怎么发表状态 编辑:程序博客网 时间:2024/05/18 02:21

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        }    }}
0 0