You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.5 KiB
37 lines
1.5 KiB
6 months ago
|
shader_type canvas_item;
|
||
|
|
||
|
// Indicates how far the transition is (0 start, 1 end).
|
||
|
uniform float progress : hint_range(0.0, 1.0);
|
||
|
// The previous background, transparent if there was none.
|
||
|
uniform sampler2D previous_background : source_color, hint_default_transparent;
|
||
|
// The next background, transparent if there is none.
|
||
|
uniform sampler2D next_background : source_color, hint_default_transparent;
|
||
|
|
||
|
// The texture used to determine how far along the progress has to be for bending in the new background.
|
||
|
uniform sampler2D wipe_texture : source_color;
|
||
|
// The size of the trailing smear of the transition.
|
||
|
uniform float feather : hint_range(0.0, 1.0, 0.0001) = 0.1;
|
||
|
// Determines if the wipe texture should keep it's aspect ratio when scaled to the screen's size.
|
||
|
uniform bool keep_aspect_ratio = false;
|
||
|
|
||
|
void fragment() {
|
||
|
vec2 frag_coord = UV;
|
||
|
if(keep_aspect_ratio) {
|
||
|
vec2 ratio = (SCREEN_PIXEL_SIZE.x > SCREEN_PIXEL_SIZE.y) // determine how to scale
|
||
|
? vec2(SCREEN_PIXEL_SIZE.y / SCREEN_PIXEL_SIZE.x, 1) // fit to width
|
||
|
: vec2(1, SCREEN_PIXEL_SIZE.x / SCREEN_PIXEL_SIZE.y); // fit to height
|
||
|
|
||
|
frag_coord *= ratio;
|
||
|
frag_coord += ((vec2(1,1) - ratio) / 2.0);
|
||
|
}
|
||
|
|
||
|
// get the blend factor between the previous and next background.
|
||
|
float alpha = (texture(wipe_texture, frag_coord).r) - progress;
|
||
|
float blend_factor = 1. - smoothstep(0., feather, alpha + (feather * (1. -progress)));
|
||
|
|
||
|
vec4 old_frag = texture(previous_background, UV);
|
||
|
vec4 new_frag = texture(next_background, UV);
|
||
|
|
||
|
COLOR = mix(old_frag, new_frag, blend_factor);
|
||
|
}
|