luma_wipe_transition.effect 1.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
// Based rendermix wipe shader
// https://github.com/rectalogic/rendermix-basic-effects/blob/master/assets/com/rendermix/Wipe/Wipe.frag

uniform float4x4  ViewProj;
uniform texture2d a_tex;
uniform texture2d b_tex;
uniform texture2d l_tex;
uniform float progress;
uniform bool  invert;
uniform float softness;

sampler_state textureSampler {
	Filter    = Linear;
	AddressU  = Clamp;
	AddressV  = Clamp;
};

struct VertData {
	float4 pos : POSITION;
	float2 uv  : TEXCOORD0;
};

VertData VSDefault(VertData v_in)
{
	VertData vert_out;
	vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj);
	vert_out.uv  = v_in.uv;
	return vert_out;
}

float4 PSLumaWipe(VertData v_in) : TARGET
{
	float2 uv = v_in.uv;
	float4 a_color = a_tex.Sample(textureSampler, uv);
	float4 b_color = b_tex.Sample(textureSampler, uv);
	float luma     = l_tex.Sample(textureSampler, uv).x;

	if (invert)
		luma = 1.0f - luma;

	float time = lerp(0.0f, 1.0f + softness, progress);

	if (luma <= time - softness)
		return b_color;

	if (luma >= time)
		return a_color;

	float alpha = (time - luma) / softness;

	return lerp(a_color, b_color, alpha);
}

technique LumaWipe
{
	pass
	{
		vertex_shader = VSDefault(v_in);
		pixel_shader = PSLumaWipe(v_in);
	}
}