Shader "Twist" { Properties { _MainTex ("Main Texture", 2D) = "white" {} _Color("Main Color", Color) = (1,1,1,1) _TwistUvAmount("Twist Amount", Range(0, 3.1416)) = 1 _TwistUvPosX("Twist Pos X Axis", Range(0, 1)) = 0.5 _TwistUvPosY("Twist Pos Y Axis", Range(0, 1)) = 0.5 _TwistUvRadius("Twist Radius", Range(0, 3)) = 0.75 } SubShader { Tags {"Queue" = "Transparent" "RenderType"="Opaque" "IgnoreProjector" = "True" } Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; half4 color : COLOR; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; half4 color : COLOR; }; sampler2D _MainTex; half4 _MainTex_ST, _Color; half _TwistUvAmount, _TwistUvPosX, _TwistUvPosY, _TwistUvRadius; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.color = v.color; return o; } half4 frag (v2f i) : SV_Target { half2 tempUv = i.uv - half2(_TwistUvPosX * _MainTex_ST.x, _TwistUvPosY * _MainTex_ST.y); _TwistUvRadius *= (_MainTex_ST.x + _MainTex_ST.y) / 2; half percent = (_TwistUvRadius - length(tempUv)) / _TwistUvRadius; half theta = percent * percent * (2.0 * sin(_TwistUvAmount)) * 8.0; half s = sin(theta); half c = cos(theta); half beta = max(sign(_TwistUvRadius - length(tempUv)), 0.0); tempUv = half2(dot(tempUv, half2(c, -s)), dot(tempUv, half2(s, c))) * beta + tempUv * (1 - beta); tempUv += half2(_TwistUvPosX * _MainTex_ST.x, _TwistUvPosY * _MainTex_ST.y); i.uv = tempUv; half4 col = tex2D(_MainTex, i.uv) * i.color; col *= _Color; return col; } ENDCG } } Fallback "Sprites/Default" }