UnityShader—将两个纹理附加并将其中的一个纹理循环显示

Shader "Custom/UVAnimation"  
{  
    Properties  
    {  
        // 设置纹理1以及纹理2
        _MainTex ("Texture", 2D) = "white" {}  
        _SubTex ("SubTexture", 2D) = "white" {}  
    }  
    SubShader  
    {  
        Tags { "RenderType"="Opaque" }  
        LOD 100  
  
        Pass  
        {  
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            #include "UnityCG.cginc"  
  
            struct appdata  
            {  
                float4 vertex : POSITION;  
                float2 uv : TEXCOORD0;  
            };  
  
            struct v2f  
            {  
                float2 uv : TEXCOORD0;  
                float4 vertex : SV_POSITION;  
            };  
           // 要在片元中使用,就必须要在这里定义,得和Properties里面同样的名字
            sampler2D _SubTex;  
            sampler2D _MainTex;  
            float4 _MainTex_ST;  
  
            v2f vert (appdata v)  
            {  
                v2f o;  
                o.vertex = UnityObjectToClipPos(v.vertex);  
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);   
                return o;  
            }  
  
            fixed4 frag (v2f i) : SV_Target  
            {  
                  // 定义一个纹理偏移量,这个偏移量用来偏移纹理,产生纹理移动的效果
                float2 uvoffset = float2(0,0);  
          //将x和y方向的偏移量设置成根据时间的延时,纹理时二维的,只有u,v两个方向
                uvoffset.x = _Time.y;  
                uvoffset.y = _Time.y;  
                  // 将纹理的坐标加上偏移量
                fixed4 subcol = tex2D(_SubTex, i.uv+uvoffset);   
                // sample the texture  
                fixed4 col = tex2D(_MainTex, i.uv);        
                fixed4 ResColor = subcol + col;  
  
                return ResColor;  
            }  
            ENDCG  
        }  
    }  
}  

该效果可以应用于一些水面流动的效果,或者光线透过水照射在鱼儿身上的效果

Tip:记得将纹理的循环模式修改成repeat模式

UnityShader—将两个纹理附加并将其中的一个纹理循环显示_第1张图片

你可能感兴趣的:(Unity)