1

I've got a CG shader which scrolls a sprite in a SpriteRenderer in Unity, like so:

https://i.stack.imgur.com/2PT1X.jpg

The problem is that there's no "bending" on the edges of the sprite, so it doesn't look like the bowling ball is rolling. I'd like to add a fisheye effect. I see there is a simple fisheye effect shader here:

http://www.michaelbibby.co.uk/2017/10/05/simple-fish-eye-post-process-shader/

which I am trying to add to my scrolling effect by taking the frag shader function and putting it in my shader. But when I do, it tells me that the v2f called i in the frag shader doesn't have a .uv property. I don't understand this problem, because there doesn't seem to be a definition for a struct of type v2f in my shader, though there is in the fisheye effect one.

Here's my starting point, which is the scrolling shader being used in the video. Can anyone advise me on how to add the fisheye effect?

Shader "Custom/ScrollingSprite" {
    Properties {
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
        _Color("Tint", Color) = (1,1,1,1)
        _Scroll("Scroll Speed", Vector) = (0,0,0,0)
        [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
    }
 
    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 SpriteVertScrolling
            #pragma fragment SpriteFrag
            #pragma target 2.0
            #pragma multi_compile_instancing
            #pragma multi_compile_local _ PIXELSNAP_ON
            #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
            #include "UnitySprites.cginc"
 
            float2 _Scroll;

            // A copy of SpriteVert() from builtin_shaders-2019.1.7f1/CGIncludes/UnitySprites.cginc
            v2f SpriteVertScrolling(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.texcoord.x += _Scroll.x;
                OUT.texcoord.y += _Scroll.y;
                OUT.color = IN.color * _Color * _RendererColor;
 
                #ifdef PIXELSNAP_ON
                OUT.vertex = UnityPixelSnap(OUT.vertex);
                #endif
 
                return OUT;
            }
 
            ENDCG
        }
    }
}
 





Catlard
  • 853
  • 6
  • 13
  • 30

1 Answers1

1

The definition of v2f is in UnitySprites.cginc:

struct v2f
{
    float4 vertex   : SV_POSITION;
    fixed4 color    : COLOR;
    float2 texcoord : TEXCOORD0;
    UNITY_VERTEX_OUTPUT_STEREO
};

In this the uv's are called texcoord. You can use i.texcoord instead of i.uv. You don't seem to need anything else, apart from the _Distortion property, in order to implement the effect.

Pluto
  • 3,911
  • 13
  • 21
  • Thanks! This worked. It compiles with no errors -- but the function doesn't seem to have any visual effect on the sprite. Here's where I am now: – Catlard Aug 29 '20 at 13:47
  • @Catlard If you are not already doing this, you have to implement the effect (add the frag function from the link you posted in the question instead of using the default `SpriteFrag`). And you might have to use 2 sets of uv's: one unchanged/default for the fisheye effect, and one scrolling uv for the rolling animation. Just define your own out struct `struct myv2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 uv : TEXCOORD0; float2 scrolluv : TEXCOORD1; UNITY_VERTEX_OUTPUT_STEREO };` – Pluto Aug 29 '20 at 14:10
  • yep! This was the problem. Thanks! I got it working just dandily. You're the best. – Catlard Aug 31 '20 at 11:19