editor/src/shaders/gui.frag.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;
}