Unity Shader学习笔记:渐变纹理

来源:互联网 发布:js防水涂料怎么做 编辑:程序博客网 时间:2024/05/16 17:31
Shader "Own/Chapter7-RampTexture"{    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    {        Pass        {            Tags{"LightMode" = "ForwardBase"}            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "Lighting.cginc"            fixed4 _Color;            sampler2D _RampTex;            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;            };            v2f vert(a2v v){                v2f o;                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);                o.worldNormal = UnityObjectToWorldNormal(v.normal);                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;                //经过平铺和缩放后的纹理坐标                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));                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;                fixed halfLambert = 0.5 * dot(worldNormal,worldLightDir) + 0.5;                fixed3 diffuseColor = tex2D(_RampTex,fixed2(halfLambert,halfLambert)).rgb * _Color.rgb;                fixed3 diffuse = _LightColor0.rgb * diffuseColor;                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));                fixed3 halfDir = normalize(worldLightDir + viewDir);                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal,halfDir)),_Gloss);                return fixed4(ambient + diffuse + specular,1.0);            }            ENDCG        }    }    Fallback "Specular"}

其中使用halfLambert对纹理进行采样,即利用法线与光线的点积对纹理取样,当法线与光线的夹角越小,这求得的halfLambert越大,此时取的纹理坐标越靠近右上角,因为在Unity中,纹理坐标从下到上,从左到右递增。当法线与光线的夹角越大,此时物体接收到的光线就越少,求得的halfLambert就越小,此时取的纹理坐标越靠近左下角。利用这个规律,可以制作渐变纹理,如黑到白的渐变,或黑到灰到白的渐变。
自己也可以利用其他的计算公式取样,上述代码来自《Unity Sahder入门精要》
渐变纹理示例:
示例一
示例二
示例三