e1e21c01d5
In transitions, because the 'to' and 'from' are always rendered to textures, the end result will always have premultiplied alpha. This would cause alpha to have blackish edges during transition, and cause semi-transparent images to appear darker than they were supposed to. To replicate, simply set the transparency of a source to 50%, then transition between that scene and another scene. The source will appear to "pop" in and out unnaturally due to the premultiplied alpha effect of the render targets. To fix this, the solution is to simply convert premultiplied alpha to straight alpha in the transition pixel shaders.
64 lines
1.3 KiB
Plaintext
64 lines
1.3 KiB
Plaintext
// 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;
|
|
};
|
|
|
|
#include "premultiplied.inc"
|
|
|
|
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 = convert_pmalpha(a_tex.Sample(textureSampler, uv));
|
|
float4 b_color = convert_pmalpha(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);
|
|
}
|
|
}
|