У меня есть такой шейдер и код. Что нужно поменять что бы нечетные тайлы двигались по _direction, а четные в противоположном направлении ? Я так понимаю нужно избавиться от общего оффсет и возможно вообще избавиться от скрипта ChessTileAnimation, и перейти на TIme внутри шейдера, но я невдупляю как это сделать
P.S Избавился от класса ChessTileAnimation
Shader "UI/ChessTiled"
{
Properties
{
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_Tiling("Tiling", Vector) = (1,1,0,0)
_ScrollDirection("Scroll Direction", Vector) = (0.5, -0.5, 0, 0)
_ScrollSpeed("Scroll Speed", Float) = 1.0
_Offset("Offset", Vector) = (0,0,0,0)
_Padding("Padding", Vector) = (0.1, 0.1, 0, 0)
_RotationAngle("Rotation Angle", Float) = 0.0
_Pivot("Rotation Pivot", Vector) = (0.5, 0.5, 0, 0)
_Color("Tint", Color) = (1,1,1,1)
_FadeStart("Fade Start", Range(0,1)) = 0.5
_FadeEnd("Fade End", Range(0,1)) = 1.0
_FadePower("Fade Power", Float) = 1.0
// Stencil properties
[HideInInspector] _StencilComp("Stencil Comparison", Float) = 8
[HideInInspector] _Stencil("Stencil ID", Float) = 0
[HideInInspector] _StencilOp("Stencil Operation", Float) = 0
[HideInInspector] _StencilWriteMask("Stencil Write Mask", Float) = 255
[HideInInspector] _StencilReadMask("Stencil Read Mask", Float) = 255
[HideInInspector] _ColorMask("Color Mask", Float) = 15
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"RenderType" = "Transparent"
}
Cull Off
ZWrite Off
//Lighting Off
//ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
//ColorMask [_ColorMask]
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
float2 screenPos : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float2 _Tiling;
float2 _ScrollDirection;
float _ScrollSpeed;
float2 _Offset;
float2 _Padding;
float _RotationAngle;
float2 _Pivot;
fixed4 _Color;
float _FadeStart;
float _FadeEnd;
float _FadePower;
v2f vert(appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.color = v.color * _Color;
o.screenPos = ComputeScreenPos(o.vertex).xy;
return o;
}
float2 rotateUV(float2 uv, float angle, float2 pivot)
{
float s = sin(radians(angle));
float c = cos(radians(angle));
uv -= pivot;
float2x2 rotMatrix = float2x2(c, -s, s, c);
uv = mul(rotMatrix, uv);
uv += pivot;
return uv;
}
float2 getAnimatedOffset(float2 direction, float speed)
{
// Учитываем угол поворота для направления анимации
float angle = radians(_RotationAngle);
float s = sin(angle);
float c = cos(angle);
// Поворачиваем направление согласно углу шейдера
float2 rotatedDirection = float2(
direction.x * c - direction.y * s,
direction.x * s + direction.y * c
);
return rotatedDirection * (_Time.y * speed);
}
fixed4 frag(v2f i) : SV_Target
{
// Рассчитываем автоматическое смещение на основе времени
float2 offset = getAnimatedOffset(_ScrollDirection, _ScrollSpeed);
// Учитываем отступы при расчете тайлинга
float2 scaledTiling = _Tiling * (1.0 + _Padding);
float2 uv = i.uv * scaledTiling + offset;
// Рассчитываем точку вращения в мировых координатах
float2 pivotWorld = _Pivot * scaledTiling + offset;
// Вращаем координаты тайлов для шахматного порядка
float2 rotatedUV = rotateUV(uv, _RotationAngle, pivotWorld);
float2 tilePos = floor(rotatedUV);
float2 localUV = rotatedUV - tilePos;
// Применяем отступы
float2 textureUV = localUV * (1.0 + _Padding) - _Padding * 0.5;
// Проверяем шахматный порядок
bool shouldRender = frac((tilePos.x + tilePos.y) * 0.5) < 0.5;
// Отбрасываем фрагменты в отступах и невидимых тайлах
if (!shouldRender || any(textureUV < 0.0) || any(textureUV > 1.0))
discard;
fixed4 col = tex2D(_MainTex, textureUV) * i.color;
// Рассчитываем расстояние от центра экрана (нормализованные координаты)
float2 center = float2(0.5, 0.5);
float2 screenUV = i.screenPos;
float distance = length(screenUV - center);
float fade = 1.0 - smoothstep(_FadeStart, _FadeEnd, distance);
fade = pow(fade, _FadePower);
col.a *= fade;
return col;
}
ENDCG
}
}
}