Пытаюсь написать шейдер для травы с одним неподвижным и одним качающимся концом - PullRequest
1 голос
/ 10 июля 2020

Это шейдер для водорослей, мне нужно получить так, чтобы один конец был почти неподвижен, а другой качался.

Проблема: в настоящее время все качается.

Как я могу изменить это так, чтобы качался только один конец?

Shader "Custom/SwayingGrassHalloween"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
        [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
        [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
        [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
        _Speed ("MoveSpeed", Range(1,50)) = 25 // speed of the swaying
        _WaveStrength ("WaveStrength", Range(-5, 5)) = 1 // strength of the swaying
        _SwayX("Sway X", Range(-5, 5)) = 0.5 // how far the swaying goes
        _SwayY("Sway Y", Range(-5, 5)) = 0.5 // how far the swaying goes
    }

    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Cull Off
        Lighting Off
        ZWrite Off
        Blend One OneMinusSrcAlpha

        Pass
        {
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            #pragma multi_compile_instancing
            #pragma multi_compile_local _ PIXELSNAP_ON
            #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
            #include "UnitySprites.cginc"

            float _Speed;
            float _SwayX;
            float _SwayY;
            float _YOffset;
            float _WaveStrength;
           
            v2f vert(appdata_t IN)
            {
                v2f OUT;
                
                UNITY_SETUP_INSTANCE_ID (IN);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
                OUT.vertex = UnityFlipSprite(IN.vertex, _Flip);
                OUT.vertex = UnityObjectToClipPos(OUT.vertex);
                OUT.texcoord = IN.texcoord;
                OUT.color = IN.color * _Color * _RendererColor;
                
                #ifdef PIXELSNAP_ON
                OUT.vertex = UnityPixelSnap (OUT.vertex);
                #endif

                float sinOff = (IN.vertex.x + IN.vertex.y + IN.vertex.z) * _WaveStrength;
                float t =-_Time * _Speed;
                float fx = IN.texcoord.x;
                float fy = IN.texcoord.x * IN.texcoord.y;
                
                OUT.vertex.x += sin(t * 1.45f + sinOff) * fx * _SwayX;
                OUT.vertex.y += sin(t * 1.45 + sinOff) * fy * _SwayY;

                return OUT;
            }

            fixed4 frag(v2f IN) : SV_Target
            {
                fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
                c.rgb *= c.a;
                return c;
            }
        ENDCG
        }

        
    }
}
...