Shader parameter is not being tweened

Godot Version

4.4.1

Question

For some reason, when I try to tween a parameter on shader, acts very weird, like it clips to 0 or 1

The shader is pretty simple, it only shifts UV to “submerge” a sprite:


uniform float phase;

void vertex() {
	UV.y -= phase;
}

void fragment() {
}

And the tween code looks like this:

tween = bakuganToMove.CreateTween().SetParallel();
tween.TweenProperty(bakuganToMove.GetChild<Control>(0).Material, "shader_parameter/phase", 1.0, 1);
tween.TweenProperty(bakuganToMove.GetChild(1), "modulate", new Color(1, 1, 1, 0), 0.3);
tween.Chain().TweenProperty(bakuganToMove, "position", newPosition, 0.2);
tween.Chain().TweenProperty(bakuganToMove.GetChild<Control>(0).Material, "shader_parameter/phase", 0.0, 1).Finished += () => tweens.Remove(tween);
tween.TweenProperty(bakuganToMove.GetChild(1), "modulate", new Color(1, 1, 1), 0.3);
break;

When adjusting value manually via remote scene control, sprite offsets as intended

Hi!

Definitely not sure about that, but maybe try with a TweenMethod and a lambda function? I don’t know how TweenProperty behaves when it comes to shader properties (compared to class properties).

ShaderMaterial shaderMaterial = bakuganToMove.GetChild<Control>(0).Material as ShaderMaterial;

# 0 to 1:
tween.TweenMethod(Callable.From<float>(t => shaderMaterial.SetShaderParameter("phase", t)), 0f, 1f, 1f);

# ...

# 1 to 0:
tween.TweenMethod(Callable.From<float>(t => shaderMaterial.SetShaderParameter("phase", t)), 1f, 0f, 1f);

Let me know if that works better.

Yes, it has absolutely worked, thank you! Odd that it doesn’t work with TweenProperty, it had never failed me before

1 Like

Weird, I tested it in GDScript and it worked fine:

extends Node


func _ready() -> void:
	var tween = create_tween().set_parallel()
	tween.tween_property($Sprite2D.material, "shader_parameter/phase", 1.0, 1.0)
	tween.tween_property($Sprite2D, "modulate", Color.RED, 0.3)
	tween.chain().tween_property($Sprite2D, "position", Vector2(100, 100), 0.2).as_relative()
	tween.chain().tween_property($Sprite2D.material, "shader_parameter/phase", 0.0, 1.0)
	tween.tween_property($Sprite2D, "modulate", Color.WHITE, 0.3)

Result:

Maybe in C# it does not get that the parameter is a float and treat it as an int?

But why would it only do it now, but never before?

Edit: figured it out, I’ve set shader parameter on shader initialization as an integer, that what was causing the issue