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