linphone-desktop/Linphone/data/shaders/roundEffect.frag
2024-04-22 18:16:32 +02:00

43 lines
1.7 KiB
GLSL

#version 440
//qsb --glsl "100 es,120,150" --hlsl 50 --msl 12 -o roundEffect.frag.qsb roundEffect.frag
// qt_TexCoord0 E [0.0 , 1.0]
layout(location = 0) in vec2 qt_TexCoord0;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform buf {
mat4 qt_Matrix;
float qt_Opacity;
// How soft the edges should be (in pixels). Higher values could be used to simulate a drop shadow. = 1.0
float edgeSoftness;
// The radius of the corners (in pixels).
float radius;
// Apply a drop shadow effect. = 0.5
float shadowSoftness;
// Drop shadow offset. = 0.5
float shadowOffset;
float width;
float height;
} ubuf;
layout(binding = 1) uniform sampler2D src;
float roundedBoxSDF(vec2 position, vec2 offset, float radius) {
return length(max(abs(position)-offset+radius,0.0))-radius;
}
void main(){
vec2 size = vec2(ubuf.width, ubuf.height);
vec2 center = vec2(0.5);
// Calculate distance to edge.
float dist = roundedBoxSDF( (qt_TexCoord0.xy - center) * size, size/2.0 - 1.0, ubuf.radius);
float smoothedAlpha = max(1.0 - smoothstep(-ubuf.edgeSoftness, ubuf.edgeSoftness * 2.0, dist), 0);
// Return the resultant shape.
vec4 tex = texture(src, qt_TexCoord0.st);
vec4 quadColor = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(tex.rgb, smoothedAlpha), smoothedAlpha);
// Apply a drop shadow effect.
vec2 shadowOffset = vec2(0.0, ubuf.shadowOffset);
float shadowDistance = roundedBoxSDF((qt_TexCoord0.xy - center) * size, size/2.0, ubuf.radius);
float shadowAlpha = 1.0 - smoothstep(-1.0, ubuf.shadowSoftness, shadowDistance);
vec4 shadowColor = vec4(0.4, 0.4, 0.4, 1.0);
fragColor = mix(quadColor, shadowColor, shadowAlpha - smoothedAlpha) * ubuf.qt_Opacity;
}