CC
Size: a a a
CC
CC
CC
CC
CC
CC
CC
CC
CC
K
CC
CC
CC
CC
CC
CC
CC
CC
🦊
CC
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform sampler2D ourSecondTexture;
uniform float visibility1;
vec4 temp1, temp2, temp3;
float temp_red, temp_green, temp_blue, temp_alpha;
vec2 reverse(vec2 someCoord)
{
return vec2(1 - someCoord.x, someCoord.y);
}
vec4 calc(vec4 underColor, vec4 aboveColor)
{
// let's consider vec4 beforeColor and vec4 afterColor and resultColor
// x = beforeColor.r
// y = underColor.r
// z = aboveColor.r
// a = underColor.a
// b = aboveColor.a
// h = afterColor.r
// magic = resultColor.r
// h = (x * (1-a) + y * a) * (1-b) + z * b
// h = x * (1-a) * (1-b) + y * a * (1-b) + z * b
// h = x * (1-a-b+ab) + magic * (a+b-ab)
temp_alpha = underColor.a + aboveColor.a - underColor.a * aboveColor.a;
// y * a * (1-b) + z * b = magic * (a+b-ab)
// magic = (y * a * (1-b) + z * b) / (a+b-ab)
temp_red = (underColor.r * underColor.a * (1 - aboveColor.a) + aboveColor.r * aboveColor.a) / temp_alpha;
temp_green = (underColor.g * underColor.a * (1 - aboveColor.a) + aboveColor.g * aboveColor.a) / temp_alpha;
temp_blue = (underColor.b * underColor.a * (1 - aboveColor.a) + aboveColor.b * aboveColor.a) / temp_alpha;
return vec4(temp_red, temp_green, temp_blue, temp_alpha);
}
vec4 changeVisibility(vec4 initialColor, float visibility)
{
return vec4(initialColor.rgb, initialColor.a * visibility);
}
void main()
{
temp1 = texture(ourTexture, TexCoord);
temp2 = texture(ourSecondTexture, reverse(TexCoord));
temp3 = calc(temp1, changeVisibility(temp2, visibility1));
FragColor = temp3;
}