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.
sixrobin:
TweenMethod(Callable.From<float>(t => shaderMaterial.SetShaderParameter("phase", t)), 1f, 0f, 1f);
Yes, it has absolutely worked, thank you! Odd that it doesn’t work with TweenProperty, it had never failed me before
1 Like
mrcdk
April 24, 2025, 5:17am
4
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