Quick answer: Register the global in Project Settings → Shader Globals first. Then declare it as global uniform in the shader and set it with RenderingServer.global_shader_parameter_set.

A weather shader reads a global uniform float wetness; but it’s always 0 — the global was never registered in project settings.

Register the Global First

Project Settings → Shader Globals. Add an entry: name wetness, type float, default 0.0. This makes the name known engine-wide.

Declare in the Shader

global uniform float wetness;

void fragment() {
    ALBEDO = mix(dry_color, wet_color, wetness);
}

The global uniform qualifier binds to the project-registered global by name. A name mismatch = “not found” or silent zero.

Set the Value at Runtime

RenderingServer.global_shader_parameter_set("wetness", 0.8)

One call updates the value for every shader using that global — the whole point of globals. No per-material set needed.

Override Per Shader

For a one-frame override on a single material, use global_shader_parameter_set_override. Use sparingly — it defeats the “one value everywhere” benefit.

Verifying

Change wetness once via RenderingServer. Every weather-aware material updates together. The Shader Globals list shows the registered name.

“Globals must be registered in Project Settings before any shader can bind them.”

Globals are perfect for time-of-day, wind, and weather — one value, every shader, set from a single autoload.