unity-game-engineshaderfragment-shadervertex-shaderpixel-shader

Adding fisheye effect to CG shader for Unity Sprite


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

https://i.sstatic.net/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
        }
    }
}
 






Solution

  • 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.