You can kinda fake it using GLSL. Here are a couple methods:
Morph1
uniform float progress;
uniform float morph_strength;
vec4 getFromColor(vec2 uv){ return texture(sTD2DInputs[0], uv); }
vec4 getToColor(vec2 uv){ return texture(sTD2DInputs[1], uv); }
vec4 Morph1(vec2 uv)
{
vec4 ca = getFromColor(vUV.st);
vec4 cb = getToColor(vUV.st);
vec2 oa = (((ca.rg+ca.b)*0.5)*2.0-1.0);
vec2 ob = (((cb.rg+cb.b)*0.5)*2.0-1.0);
vec2 oc = mix(oa,ob,0.5)*morph_strength;
float w0 = progress;
float w1 = 1.0-w0;
return mix(getFromColor(vUV.st+oc*w0), getToColor(vUV.st-oc*w1), progress);
}
layout(location = 0) out vec4 fragColor;
void main() {
vec4 o = Morph1(vUV.st);
fragColor = TDOutputSwizzle(o);
}
Morph2
uniform float progress;
vec4 getFromColor(vec2 uv){ return texture(sTD2DInputs[0], uv); }
vec4 getToColor(vec2 uv){ return texture(sTD2DInputs[1], uv); }
vec4 getFromColorBias(vec2 uv, float bias){ return texture(sTD2DInputs[0], uv, bias); }
vec4 getToColorBias(vec2 uv, float bias){ return texture(sTD2DInputs[1], uv, bias); }
vec4 Morph2(vec2 uv)
{
float rad = mix((1.0 - (1.0-progress)), progress, progress);
rad = mix( rad, progress, abs(2.1*progress - 1.0) - 0.1 );
float bias = 5.0;
float scale_x = 0.02;
float scale_y = 0.02;
float stretch = 0.02;
vec2 perturb;
vec2 slope;
vec4 color;
vec4 pd_bl_a = getFromColorBias( vec2( -scale_x, -scale_y ) + uv, bias ) * (1.0-progress);
vec4 pd_bl_b = getToColorBias( vec2( -scale_x, -scale_y ) + uv, bias ) * progress;
vec4 pd_tr_a = getFromColorBias( vec2( scale_x, scale_y ) + uv, bias ) * (1.0-progress);
vec4 pd_tr_b = getToColorBias( vec2( scale_x, scale_y ) + uv, bias ) * progress;
vec4 pd_tl_a = getFromColorBias( vec2( -scale_x, scale_y ) + uv, bias ) * (1.0-progress);
vec4 pd_tl_b = getToColorBias( vec2( -scale_x, scale_y ) + uv, bias ) * progress;
vec4 pd_br_a = getFromColorBias( vec2( scale_x, -scale_y ) + uv, bias ) * (1.0-progress);
vec4 pd_br_b = getToColorBias( vec2( scale_x, -scale_y ) + uv, bias ) * progress;
vec4 from = getFromColorBias( uv, bias ) * (1.0-progress);
vec4 to = getToColorBias( uv, bias ) * progress;
vec4 d = (pd_tl_a + pd_tr_a + pd_bl_a + pd_br_a + from * 2.0
-(pd_tl_b + pd_tr_b + pd_bl_b + pd_br_b + to * 2.0 ));
float diff = d.r + d.g + d.b;
vec4 sx = ((pd_tl_a + pd_tl_b + pd_bl_a + pd_bl_b)
- (pd_tr_a + pd_tr_b + pd_br_a + pd_br_b));
vec4 sy = ((pd_bl_a + pd_bl_b + pd_br_a + pd_br_b)
- (pd_tl_a + pd_tl_b + pd_tr_a + pd_tr_b));
slope.x = sx.r + sx.g + sx.b;
slope.y = sy.r + sy.g + sy.b;
float p_len = dot( slope, slope ) + 1.0;
perturb = vec2( slope.x / p_len, slope.y / p_len ) * diff;
vec2 pert_to = perturb * (1.0-rad) * stretch;
perturb *= rad * stretch;
vec4 col1 = getFromColor( uv + perturb ) * (1.0-progress);
vec4 col2 = getToColor( uv - pert_to ) * progress;
return col1 + col2; //mix(col1, col2, progress);
}
layout(location = 0) out vec4 fragColor;
void main() {
vec4 o = Morph2(vUV.st);
fragColor = TDOutputSwizzle(o);
}