Shader基于顶点编程的Lambert光照,Phong光照和Blinn-Phong光照

Lambert光照模型(环境光+漫反射):

Shader "Custom/ShaderLambert" {

    SubShader {
        Pass{
            CGPROGRAM

            #include "unitycg.cginc"
            #include "lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag   

            struct params{
                float4 Pos:POSITION;
                float4 Col:COLOR;
            };

            params vert(appdata_base ab)
            {
                params pms;
                pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
                pms.Col = UNITY_LIGHTMODEL_AMBIENT;       //环境光

                float3 N;
                float3 L;
                //求法向量
                //N = normalize(UnityObjectToWorldNormal(ab.normal));   //系统自带UnityObjectToWorldNormal:将模型法向量转换到世界

                N = normalize(ab.normal);     //自行处理法向量
                N = mul(float4(N,0),_World2Object).xyz; //由于此处存在法向量非等比转换问题,故需要将法向量乘以它的逆转矩阵,如右侧

                //求光向量
                //L = normalize(WorldSpaceLightDir(ab.vertex));        //系统自带WorldSpaceLightDir:传入顶点求世界方向的光向量

                L = normalize(_WorldSpaceLightPos0);    //自行处理光向量,此处用mul,因为法向量和光向量变其中一个让他们统一就行

                float DotNL = saturate(dot(N,L));           //计算漫反射夹角

                pms.Col += _LightColor0 * DotNL;      //环境光+漫反射

                return pms;

            }

            float4 frag(params INPUT):COLOR
            {
                return INPUT.Col;
            }

            ENDCG
        }
    }
}

Phong光照模型(环境光+漫反射+镜面高光):

Shader "Custom/ShaderPhong_Vertex" {
    Properties{
        _SpecularColor("SpecularColor",color) = (1,1,1,1)
    }
    SubShader {
        Pass{
            CGPROGRAM

            #include "unitycg.cginc"
            #include "lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag

            float4 _SpecularColor;

            struct parmas{
                float4 Pos:POSITION;
                float4 Col:COLOR;
            };

            parmas vert(appdata_base ab)
            {
                parmas pms;
                pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
                pms.Col = UNITY_LIGHTMODEL_AMBIENT;    //环境光

                float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
                float3 L =normalize(WorldSpaceLightDir(ab.vertex)).xyz;

                float DotNL = saturate(dot(N,L));    //转化为[0,1]之内

                pms.Col = pms.Col+_LightColor0 * DotNL;    //环境光 + 漫反射


                //通过Reflect 获取反射光线
                float3 R = normalize(reflect(-WorldSpaceLightDir(ab.vertex),N));  //使用reflect() 其中光源要指向顶点
                //float3 R = normalize(2*dot(N,L)*N-L);    //手动求反射R
                float3 V = normalize(WorldSpaceViewDir(ab.vertex));

                float DotRV = max(0,dot(R,V)+0.1);    //此处保留

                pms.Col = pms.Col*0.8+_SpecularColor*DotRV*0.1;   //环境光+漫反射+镜面反射高光

                return pms;
            }

            float4 frag(parmas INPUT):COLOR
            {
                return INPUT.Col;
            }
            ENDCG
        }   
    }
}

Blinn-Phong光照模型(环境光+漫反射+半角镜面高光):

Shader "Custom/ShaderBlinnPhong_Vertex" {
    Properties{
        _SpcularColor("SpecularColor",color) = (1,1,1,1)
    }
    SubShader {
        Pass{
            CGPROGRAM

            #include "unitycg.cginc"
            #include "lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag

            float4 _SpcularColor;

            struct parmas
            {
                float4 Pos:POSITION;
                float4 Col:COLOR;
            };

            parmas vert(appdata_base ab)
            {
                parmas pms;

                pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
                pms.Col = UNITY_LIGHTMODEL_AMBIENT;   //环境光

                float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
                float3 L = normalize(WorldSpaceLightDir(ab.vertex)).xyz;
                float DotNL = saturate(dot(N,L));

                pms.Col = pms.Col + _LightColor0*DotNL;   //环境光 + 漫反射

                //求半角向量
                float3 BJ = normalize(L + normalize(WorldSpaceViewDir(ab.vertex)));

                float DotLBJ = saturate(dot(BJ,N));

                pms.Col = pms.Col*0.8 + pow(_SpcularColor*DotLBJ*0.6,4);   //环境光 + 漫反射 + 镜面反射高光

                return pms;
            }

            float4 frag(parmas INPUT):COLOR
            {
                return INPUT.Col;
            }

            ENDCG   
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值