Files
tekton/scenes/tutorial/dim_spotlight.gdshader
T
2026-04-10 05:17:30 +08:00

32 lines
1.0 KiB
Plaintext

shader_type canvas_item;
// Spotlight rect in viewport pixel coordinates
// vec4(x, y, width, height) — set to vec4(0,0,0,0) to dim everything
uniform vec4 spotlight = vec4(0.0, 0.0, 0.0, 0.0);
uniform vec2 viewport_size = vec2(1366.0, 720.0);
uniform float dim_alpha : hint_range(0.0, 1.0) = 0.72;
uniform float padding : hint_range(0.0, 32.0) = 8.0;
void fragment() {
bool has_spotlight = spotlight.z > 1.0 && spotlight.w > 1.0;
if (has_spotlight) {
// Convert spotlight rect to UV space
float left = (spotlight.x - padding) / viewport_size.x;
float top = (spotlight.y - padding) / viewport_size.y;
float right = (spotlight.x + spotlight.z + padding) / viewport_size.x;
float bottom = (spotlight.y + spotlight.w + padding) / viewport_size.y;
bool in_hole = (UV.x >= left) && (UV.x <= right)
&& (UV.y >= top) && (UV.y <= bottom);
if (in_hole) {
COLOR = vec4(0.0, 0.0, 0.0, 0.0); // transparent — element shows through
} else {
COLOR = vec4(0.0, 0.0, 0.0, dim_alpha);
}
} else {
COLOR = vec4(0.0, 0.0, 0.0, dim_alpha);
}
}