mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-18 11:58:11 +00:00
43 lines
1.7 KiB
GLSL
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;
|
|
}
|