- 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"
}