31 lines
1.2 KiB
Plaintext
31 lines
1.2 KiB
Plaintext
shader_type canvas_item;
|
|
render_mode unshaded;
|
|
|
|
uniform vec2 grid_size = vec2(32.0, 18.0);
|
|
uniform vec4 line_color : source_color;
|
|
uniform vec4 boundary_color : source_color;
|
|
uniform float monitor_boundary = 0.0;
|
|
|
|
float grid_coverage(vec2 coordinate, float width) {
|
|
vec2 distance_to_line = abs(fract(coordinate + 0.5) - 0.5);
|
|
vec2 pixels = distance_to_line / max(fwidth(coordinate), vec2(0.00001));
|
|
vec2 coverage = 1.0 - smoothstep(vec2(width - 0.5), vec2(width + 0.5), pixels);
|
|
return max(coverage.x, coverage.y);
|
|
}
|
|
|
|
void fragment() {
|
|
vec2 cells = UV * grid_size;
|
|
float minor = grid_coverage(cells, 0.6) * 0.4;
|
|
float major = grid_coverage(cells / 4.0, 0.8) * 0.85;
|
|
vec2 edge_pixels = min(UV, 1.0 - UV) / max(fwidth(UV), vec2(0.00001));
|
|
float border = 1.0 - smoothstep(0.5, 1.5, min(edge_pixels.x, edge_pixels.y));
|
|
float alpha = max(max(minor, major), border);
|
|
vec4 result = vec4(line_color.rgb, line_color.a * alpha);
|
|
if (monitor_boundary > 0.0 && monitor_boundary < grid_size.x) {
|
|
float distance_pixels = abs(cells.x - monitor_boundary) / max(fwidth(cells.x), 0.00001);
|
|
float boundary = 1.0 - smoothstep(1.0, 2.0, distance_pixels);
|
|
result = mix(result, boundary_color, boundary);
|
|
}
|
|
COLOR = result;
|
|
}
|