Задать вопрос
PragmaGames
@PragmaGames
Увлекаюсь Unity.

Как написать шейдер?

У меня есть такой шейдер и код. Что нужно поменять что бы нечетные тайлы двигались по _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
        }
    }
}
  • Вопрос задан
  • 30 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы