41 lines
1.1 KiB
GLSL
41 lines
1.1 KiB
GLSL
#version 440
|
|
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;
|
|
vec2 itemSize;
|
|
vec4 cropBox;
|
|
vec4 borderColor;
|
|
float cornerRadius;
|
|
float borderWidth;
|
|
float pixelScale;
|
|
};
|
|
|
|
float sdRoundBox(vec2 p, vec2 halfSize, float r) {
|
|
vec2 q = abs(p) - halfSize + r;
|
|
return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r;
|
|
}
|
|
|
|
void main() {
|
|
vec2 sz = itemSize * pixelScale;
|
|
vec2 p = qt_TexCoord0 * sz;
|
|
vec4 box = cropBox * pixelScale;
|
|
float r = cornerRadius * pixelScale;
|
|
float bw = borderWidth * pixelScale;
|
|
|
|
float dImage = sdRoundBox(p - sz * 0.5, sz * 0.5, r);
|
|
float dCrop = sdRoundBox(p - (box.xy + box.zw * 0.5), box.zw * 0.5, 0.0);
|
|
|
|
float d = max(dImage, dCrop);
|
|
|
|
// ramp is exactly 1 physical pixel wide
|
|
float outer = clamp(0.5 - d, 0.0, 1.0);
|
|
float inner = clamp(0.5 - (d + bw), 0.0, 1.0);
|
|
float a = outer - inner;
|
|
|
|
fragColor = vec4(borderColor.rgb, 1.0) * (borderColor.a * a * qt_Opacity);
|
|
}
|