Rendering server can't use Duplicated materials

Godot Version

4.3.stable

Question

For my project i needed to give a unique shader to each canvas item created with the Rendering server. found out that it just doesn’t work if you give it a Duplicated shader.

Code used

extends Sprite2D

@export var mat : ShaderMaterial

func _ready():
	
	var duplicated_shader = mat.duplicate()
	
	var player_rid = RenderingServer.canvas_item_create()
	
	RenderingServer.canvas_item_set_parent(player_rid, get_canvas_item())
	
	RenderingServer.canvas_item_add_texture_rect(player_rid, Rect2((-texture.get_size() * 2) / 2, texture.get_size() * 2), texture)
	var xform_player = Transform2D(0, Vector2(400, 200))
	RenderingServer.canvas_item_set_transform(player_rid, xform_player)
	
	RenderingServer.canvas_item_set_material(player_rid, duplicated_shader.get_rid())

Shader code:

shader_type canvas_item;

void fragment() {
	COLOR = vec4(0, 0, 1, 0.7);
}

EDIT:

Actually, nevermind. It’s not a bug. Explanation in this issue:

Seems like a bug. I can reproduce it on Godot 4.5.1 with the following errors:

E 0:00:00:651   material_get_instance_shader_parameters: Parameter "material" is null.
  <C++ Source>  servers/rendering/renderer_rd/storage_rd/material_storage.cpp:2402 @ material_get_instance_shader_parameters()
E 0:00:00:651   material_update_dependency: Parameter "material" is null.
  <C++ Source>  servers/rendering/renderer_rd/storage_rd/material_storage.cpp:2414 @ material_update_dependency()

Please, open an issue in the issue tracker if there isn’t already one opened.

1 Like