Shaders not Updating when Debuging Game

Godot Version

v4.2.1.stable.mono.official

Question

Hello, I am trying to update the shaders of “interactive” objects in my game. I have enabled Next Pass on the objects I want to update, and I have added a ShaderMaterial to the objects. My problem is the shaders won’t update in game even though the shader parameter is changing.

shader_type spatial;
uniform float strength;

void fragment() {
    ALBEDO = vec3(1.0,1.0,1.0);
    ALPHA = strength;
}

This is the shader that I have added to the Next Pass of the objects. I am printing out the shader parameter strength, as well as the Resource Name of the attached shader, and the values I am getting are what I would expect. Any insight as to why the shaders are not updating would be great.

Thanks!

Code:

using Godot;
using System;
using System.Runtime.CompilerServices;

public partial class Interactive : Area3D
{
	private MeshInstance3D shader;
	private ShaderMaterial selected_shader;
	public Resource cursor_sword = ResourceLoader.Load("res://images/custom_prelim_sword_cursor.png");
	public Resource cursor_interact = ResourceLoader.Load("res://images/custom_prelim_interact_cursor.png");
	public Resource cursor = ResourceLoader.Load("res://images/custom_prelim_cursor.png");
	// Called when the node enters the scene tree for the first time.
	public override void _Ready()
	{
	}

	// Called every frame. 'delta' is the elapsed time since the previous frame.
	public override void _Process(double delta)
	{
	}

	public void change_cursor(Area3D game_object)
	{
		game_object = (Area3D)GetNode(GetPath());
		if(game_object.IsInGroup("interactive"))
		{
			
			Input.SetCustomMouseCursor(cursor_interact);
			// shader = (MeshInstance3D)game_object.GetNode("Mesh");
			// selected_shader = (ShaderMaterial)shader.GetActiveMaterial(0).NextPass;
			// selected_shader.SetShaderParameter("Strength", 1.0f);
			// GD.Print(selected_shader.ResourceName);
			// GD.Print(selected_shader.GetShaderParameter("Strength"));
		
		}

		else if(game_object.IsInGroup("attack_area"))
		{

			// game_object = (Area3D)game_object.GetParent().GetParent();
			// shader = (MeshInstance3D)game_object.GetNode("Mesh");
			// selected_shader = (ShaderMaterial)shader.GetActiveMaterial(0).NextPass;
			// selected_shader.SetShaderParameter("Strength", 1.0f);
			// GD.Print(selected_shader.ResourceName);
			// GD.Print(selected_shader.GetShaderParameter("Strength"));
		
		}
		
	}
	public void reset_cursor()
	{

			Input.SetCustomMouseCursor(cursor);
			if(selected_shader != null)
			{

				// selected_shader.SetShaderParameter("Strength", 0);
				// GD.Print(selected_shader.ResourceName);
				// GD.Print(selected_shader.GetShaderParameter("Strength"));
				
			}

	}

	public void highlight(Area3D game_object)
	{
		game_object = (Area3D)GetNode(GetPath());
		if(game_object.IsInGroup("interactive"))
		{
			
			shader = (MeshInstance3D)game_object.GetNode("Mesh");
			selected_shader = (ShaderMaterial)shader.GetActiveMaterial(0).NextPass;
			selected_shader.SetShaderParameter("Strength", 1.0f);
			GD.Print(selected_shader.ResourceName);
			GD.Print(selected_shader.GetShaderParameter("Strength"));
		
		}

		else if(game_object.IsInGroup("attack_area"))
		{

			game_object = (Area3D)game_object.GetParent().GetParent();
			shader = (MeshInstance3D)game_object.GetNode("Mesh");
			selected_shader = (ShaderMaterial)shader.GetActiveMaterial(0).NextPass;
			selected_shader.SetShaderParameter("Strength", 1.0f);
			GD.Print(selected_shader.ResourceName);
			GD.Print(selected_shader.GetShaderParameter("Strength"));
		
		}
		

	}

	public void unhighlight(Area3D game_object)
	{
		if(selected_shader != null)
			{

				selected_shader.SetShaderParameter("Strength", 0);
				GD.Print(selected_shader.ResourceName);
				GD.Print(selected_shader.GetShaderParameter("Strength"));
				
			}
	}

}

using Godot;
using System;

public partial class enemy : Interactive
{
	private Area3D game_object;
	public bool mouse_over = false;
	
	
	public override void _Ready()
	{
		this.game_object = (Area3D)GetNode(GetPath());
	}
	

	// Called every frame. 'delta' is the elapsed time since the previous frame.
	public override void _Process(double delta)
	{
	}


	public override void _MouseEnter()
    {
		change_cursor(game_object);
		highlight(game_object);
			if(game_object.IsInGroup("attack_area"))
			{
				GD.Print("over enemy");
			}
        base._MouseEnter();
    }

    public override void _MouseExit()
    {
		reset_cursor();
		unhighlight(game_object);
        base._MouseExit();
    }


}


using Godot;
using System;


public partial class box : Interactive
{

	private Area3D game_object;
	public bool mouse_over = false;
	
	
	public override void _Ready()
	{
		this.game_object = (Area3D)GetNode(GetPath());
	}
	

	// Called every frame. 'delta' is the elapsed time since the previous frame.
	public override void _Process(double delta)
	{
	}


	public override void _MouseEnter()
    {
		change_cursor(game_object);
		highlight(game_object);
		if(game_object.IsInGroup("interactive"))
		{
			GD.Print("over interactive");
		}

        base._MouseEnter();
    }


    public override void _MouseExit()
    {
		reset_cursor();
		unhighlight(game_object);
        base._MouseExit();
    }


}

If you don’t set shader parameters on a given frame, it will use the default value, not the previous value, I think.

Does this mean I have to update the shader parameters in my process function?

Yes, that’s probably what is going on, if I am not mistaken.

Solved the issue: SetShaderParameters(“strength”, 1.0f) instead of SetShaderParameters(“Strength”, 1.0f).

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.