91 lines
1.9 KiB
GLSL
91 lines
1.9 KiB
GLSL
#version 460
|
|
|
|
#extension GL_GOOGLE_include_directive : require
|
|
#extension GL_EXT_debug_printf : require
|
|
|
|
#include "gui.layout"
|
|
|
|
layout (location = 0) flat in uint in_has_texture;
|
|
|
|
layout (location = 1) in struct FragDataIn {
|
|
vec4 color;
|
|
vec2 uv;
|
|
vec2 dst_pos;
|
|
vec2 dst_center;
|
|
vec2 dst_half_size;
|
|
vec2 sdf_sample_pos;
|
|
float corner_radius;
|
|
float softness;
|
|
float raised;
|
|
float border_thickness;
|
|
} FD;
|
|
|
|
|
|
layout (location = 0) out vec4 FragColor;
|
|
|
|
float RectSDF(vec2 pos, vec2 half_size, float radius)
|
|
{
|
|
return length(max(abs(pos) - half_size + radius, 0.0)) - radius;
|
|
}
|
|
|
|
float ToSRGB(float col)
|
|
{
|
|
return pow(col, 1.0/2.2);
|
|
}
|
|
|
|
vec4 ToSRGB(vec4 col)
|
|
{
|
|
return vec4(ToSRGB(col.r), ToSRGB(col.g), ToSRGB(col.b), col.a);
|
|
}
|
|
|
|
vec4 ToLinear(vec4 col)
|
|
{
|
|
return pow(col, vec4(vec3(2.2), 1.0));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
float softness = FD.softness;
|
|
vec2 softness_padding = vec2(max(0, softness*2-1), max(0, softness*2-1));
|
|
|
|
float border_factor = 1.0;
|
|
if(FD.border_thickness > 0.0)
|
|
{
|
|
float border_sdf = RectSDF(FD.sdf_sample_pos,
|
|
FD.dst_half_size - vec2(FD.softness*2.0f) - FD.border_thickness,
|
|
max(FD.corner_radius - FD.border_thickness, 0.0f));
|
|
border_factor = smoothstep(0.0f, 2.0f * FD.softness, border_sdf);
|
|
}
|
|
|
|
if(border_factor < 0.001f)
|
|
{
|
|
discard;
|
|
}
|
|
|
|
float corner_factor = 1.0;
|
|
if(FD.corner_radius > 0.0 || FD.softness > 0.0)
|
|
{
|
|
float corner_sdf = RectSDF(FD.sdf_sample_pos,
|
|
FD.dst_half_size - vec2(FD.softness * 2.0f),
|
|
FD.corner_radius);
|
|
corner_factor = 1.0f - smoothstep(0.0, 2.0f * FD.softness, corner_sdf);
|
|
}
|
|
|
|
vec4 inv_gamma = vec4(1.4);
|
|
vec4 gamma = vec4(1.0/1.4);
|
|
|
|
vec4 tex_color = vec4(1.0);
|
|
if(in_has_texture != 0)
|
|
{
|
|
tex_color = texture(sampler2D(SpriteAtlas, SamplerNearest), FD.uv);
|
|
}
|
|
|
|
vec4 color = FD.color; // ToLinear(FD.color);
|
|
vec4 out_color = color * tex_color;
|
|
|
|
out_color.a *= corner_factor;
|
|
out_color.a *= border_factor;
|
|
|
|
FragColor = out_color;
|
|
}
|