美文网首页
渐变纹理_01

渐变纹理_01

作者: Rayson | 来源:发表于2020-06-11 14:11 被阅读0次
Shader "Unlit/Ramp Texture"
{
    Properties
    {
        _Color ("Color Tint", Color)=(1,1,1,1)
        _RampTex ("Ramp Tex", 2D)="white"{}
        _Specular("Specular",Color)=(1,1,1,1)
        _Gloss ("Gloss" ,Range (8.0,256)) =20
    }
    SubShader
    {
        Tags { "LightMode"="ForwardBase" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
        //  #pragma multi_compile_fog
            #include "Lighting.cginc"


               fixed4 _Color;
               sampler2D _RampTex;  //定义_RampTex的纹理属性变量 float4 _RampTex_ST;
               float4 _RampTex_ST;
               fixed4 _Specular;
               float _Gloss;

           struct a2v{
                float4 vertex :POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;

           };

           struct v2f{
                float4 pos : SV_POSITION;
                float3 worldNormal :TEXCOORD0;
                float3 worldPos :TEXCOORD1;
                float2 uv : TEXCOORD2;
           };

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            

            sampler2D _MainTex;
            float4 _MainTex_ST;
            
            v2f vert (a2v v)
            {
                v2f o;

                o.pos = UnityObjectToClipPos(v.vertex);

                o.worldNormal = UnityObjectToWorldNormal(v.normal);

                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
               
               //使用内置宏TRANSFORM_TEX(顶点纹理坐标,纹理名)计算经过平铺和偏移后的纹理坐标 
                o.uv = TRANSFORM_TEX (v.texcoord,_RampTex) ;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                 fixed3 worldNormal = normalize(i.worldNormal);

                  //光源方向
                 fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));


                 //使用半兰伯特模型构建一个纹理坐标,使用此坐标对渐变纹理进行采样,uv方向都使用半兰博特,最后将渐变纹理与材质纹理相乘 
                 fixed halfLambert  = 0.5 * dot(worldNormal, worldLightDir) + 0.5;

                 //漫反射光=入射光线强度*纹素值*散射颜色
                 fixed3 diffuse = _LightColor0.rgb *  tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb * _Color.rgb;

                 //环境光
                 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                 //视角方向
                 fixed3 viewDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                 //半角方向
                 fixed3 halfDir = normalize(worldLightDir+viewDir);
                //BlinnPhong高光反射=入射光线颜色强度*材质的高光反射系数*n次平方(取值为正数(法线方向 · 半角方向),n);
                 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow (max(0, dot(worldNormal,halfDir)),_Gloss);

                 return fixed4  (ambient + diffuse +specular,1.0);
            }
            ENDCG
        }
    }

    FallBack"Specular"
}


iASE
效果对比

相关文章

网友评论

      本文标题:渐变纹理_01

      本文链接:https://www.haomeiwen.com/subject/jpdbtktx.html