Files
somaesque-native/assets/shaders/2d-solid.fragment.glsl
Daniel Ledda e768b38322 update
2026-03-06 01:36:29 +01:00

58 lines
1.7 KiB
GLSL

#version 330 core
out vec4 pixel_color;
in vec4 frag_color;
in vec2 frag_dest_position;
in vec2 frag_dest_center;
in vec2 frag_dest_half_size;
in float frag_softness;
in float frag_border_radius;
in float frag_border_thickness;
in vec4 frag_border_color;
float roundedRectSDF(vec2 sample_pos, vec2 rect_center, vec2 rect_half_size, float r) {
vec2 d2 = (abs(rect_center - sample_pos) - rect_half_size + vec2(r, r));
return min(max(d2.x, d2.y), 0.0) + length(max(d2, 0.0)) - r;
}
void main() {
vec2 softness_padding = vec2(
max(0, frag_softness*2-1),
max(0, frag_softness*2-1));
float border_factor = 1.0f;
if (frag_border_thickness != 0) {
vec2 interior_half_size = frag_dest_half_size - vec2(frag_border_thickness);
float interior_radius_reduce_f = min(
interior_half_size.x / frag_dest_half_size.x,
interior_half_size.y / frag_dest_half_size.y);
float interior_corner_radius = frag_border_radius * interior_radius_reduce_f * interior_radius_reduce_f;
float inside_d = roundedRectSDF(
frag_dest_position,
frag_dest_center,
interior_half_size - softness_padding,
interior_corner_radius);
float inside_f = smoothstep(0, 2*frag_softness, inside_d);
border_factor = inside_f;
}
float dist = roundedRectSDF(
frag_dest_position,
frag_dest_center,
frag_dest_half_size - softness_padding,
frag_border_radius);
// For texturing later
float sample = 1;
float sdf_factor = 1 - smoothstep(0, 2*frag_softness, dist);
pixel_color = frag_border_color * sample * sdf_factor * border_factor
+ frag_color * sample * sdf_factor;
};