Shadow 2D

Add a 2D shadow behind your texture.  

Shader code
/**
* Shadow 2D.
* License: CC0
* https://creativecommons.org/publicdomain/zero/1.0/
*/
shader_type canvas_item;
render_mode blend_mix;

uniform vec2 deform = vec2(2.0, 2.0);
uniform vec2 offset = vec2(0.0, 0.0);
uniform vec4 modulate : hint_color;

//uniform vec2 texture_size; //uncomment for GLES2

void fragment() {
	vec2 ps = TEXTURE_PIXEL_SIZE;
	vec2 uv = UV;
	float sizex = float(textureSize(TEXTURE,int(ps.x)).x); //comment for GLES2
	float sizey = float(textureSize(TEXTURE,int(ps.y)).y); //comment for GLES2
	//float sizex = texture_size.x; //uncomment for GLES2
	//float sizey = texture_size.y; //uncomment for GLES2
	uv.y+=offset.y*ps.y;
	uv.x+=offset.x*ps.x;
	float decalx=((uv.y-ps.x*sizex)*deform.x);
	float decaly=((uv.y-ps.y*sizey)*deform.y);
	uv.x += decalx;
	uv.y += decaly;
	vec4 shadow = vec4(modulate.rgb, texture(TEXTURE, uv).a * modulate.a);
	vec4 col = texture(TEXTURE, UV);
	COLOR = mix(shadow, col, col.a);
}
Live Preview
Tags
2d, shadow
The shader code and all code snippets in this post are under CC0 license and can be used freely without the author's permission. Images and videos, and assets depicted in those, do not fall under this license. For more info, see our License terms.

Related shaders

Comments 13

  1. Would there be a way to do this with gles2?

    0
    1. I made an update with gles2 version but unfortunately in gles2 you have to provide the texture size through a parameter.

      0
  2. How to use this and AnimatedSprite?

     

    Also, good job.

     

    Tks

    0
    1. nahrf

      prolly gotta make copy the frames of the sprite and ya know.. depends what you need to do

      0
      1. nahrf

        just using the material propertyy

        0
  3. Mamaev

    If you make the shadow long, it is cropped. How can I fix it?

    0
    1. your texture must have a bit of transparent area around the main texture so the shader has space. It can't draw outside the textures bounding box.

      0
      1. The2AndOnly

        I can't do that! It would make a terrible workflow for creating textures and complicate positioning sprites!

        0
    1. Replace hint_color with source_color, that should fix the problem.

      4