- Home /
 
 
               Question by 
               archelyte_vz · Oct 16, 2018 at 09:06 PM · 
                shadertextureshadersshader writinguv coordinates  
              
 
              [SOLVED] Tile and Rotate a UV Texture on 1 axis
I just want to be able to rotate a texture infinitely in one direction. This is pretty easy to do in Shader Graph, but that's incompatible with my project.
This is the only solution I have found:
     Shader "Custom/RotateUVs" {
         Properties {
             _MainTex ("Base (RGB)", 2D) = "white" {}
             _RotationSpeed ("Rotation Speed", Float) = 2.0
         }
         SubShader {
             Tags { "RenderType"="Opaque" }
             LOD 200
            
             CGPROGRAM
             #pragma surface surf Lambert vertex:vert
      
             sampler2D _MainTex;
      
             struct Input {
                 float2 uv_MainTex;
             };
      
             float _RotationSpeed;
             void vert (inout appdata_full v) {
                 v.texcoord.xy -=0.5;
                 float s = sin ( _RotationSpeed * _Time );
                 float c = cos ( _RotationSpeed * _Time );
                 float2x2 rotationMatrix = float2x2( c, -s, s, c);
                 rotationMatrix *=0.5;
                 rotationMatrix +=0.5;
                 rotationMatrix = rotationMatrix * 2-1;
                 v.texcoord.xy = mul ( v.texcoord.xy, rotationMatrix );
                 v.texcoord.xy += 0.5;
             }
      
             void surf (Input IN, inout SurfaceOutput o) {  
                 half4 c = tex2D (_MainTex, IN.uv_MainTex);
                 o.Albedo = c.rgb;
                 o.Alpha = c.a;
             }
             ENDCG
         }
         FallBack "Diffuse"
     }
 
               To clarify, this is NOT what I'm looking for. This rotates the textures very badly. I'm looking for a seamless spin.
Like this: 
 
                 
                sf-pannernode-v.gif 
                (393.9 kB) 
               
 
              
               Comment
              
 
               
               
               Best Answer 
              
 
              Answer by archelyte_vz · Oct 17, 2018 at 03:55 PM
This is the correct shader:
 Shader "Tile and Offset/Alpha Unlit" {
     Properties{
     _MainTex("Base (RGB)", 2D) = "white" {}
     _TextureColor("Texture Color", Color) = (1, 1, 1, 1)
     _ScrollXSpeed("X Scroll Speed", Range(-100, 100)) = 0
     _ScrollYSpeed("Y Scroll Speed", Range(-100, 100)) = 0
     _Transparency("Transparency", Range(0.5,0.5)) = 0.25
     }
         SubShader{
             Tags { "Queue"="Transparent" "RenderType" = "Transparent" }
 
             ZWrite Off
             Blend SrcAlpha OneMinusSrcAlpha
             Cull Off
 
             CGPROGRAM
             #pragma surface surf Lambert alpha
 
             sampler2D _MainTex;
             fixed4 _TextureColor;
             fixed _ScrollXSpeed;
             fixed _ScrollYSpeed;
             float _Transparency;
 
             struct Input {
                 float2 uv_MainTex;
             };
 
             struct v2f
             {
                 float2 uv : TEXCOORD0;
                 float4 vertex : SV_POSITION;
             };
 
             void surf(Input IN, inout SurfaceOutput o) {
                 fixed varX = _ScrollXSpeed * _Time;
                 fixed varY = _ScrollYSpeed * _Time;
                 fixed2 uv_Tex = IN.uv_MainTex + fixed2(varX, varY);
                 half4 c = tex2D(_MainTex, uv_Tex) * _TextureColor;
                 o.Albedo = c.rgb;
                 o.Emission = c.rgb;
                 o.Alpha = c.a;
             }
 
             fixed4 frag (v2f i) : SV_Target
             {
                 fixed4 col = tex2D(_MainTex, i.uv) + _TextureColor;
                 col.a = _Transparency;
                 return col;
             }
             ENDCG
     }
         FallBack "Diffuse"
 }
 
 
              Your answer