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();
}
}