Quick answer: Godot 4 shader TIME stuck at zero when applied to a modulated CanvasItem? Modulate property animation interferes with shader time evaluation on some backends - use a custom uniform driven by _process.

Animated shader TIME drives a glow. Add modulate animation; glow freezes.

Drive a custom uniform

material.set_shader_parameter("u_time", time_acc)

Increment in _process. Shader reads u_time; not TIME.

Or separate modulate from shader

Modulate via a parent CanvasModulate; shader on child. Separation avoids interference.

Test backends

Compatibility, Forward+. Sometimes the bug is backend-specific.

“TIME is engine state. Engine state can be unexpectedly reset.”

If your shader uses TIME, treat it as suspect. Custom uniforms are explicit; predictable.

Related reading