Problems filling 3D texture in compute shader

Godot Version

4.4.1stable, running on windows pc

Question

I’m trying to fill an empty Texture3D in a compute shader
Here is a minimal reproduction of the GDscript code i’m using:

extends Node

const IMAGE_FORMAT: Image.Format = Image.FORMAT_R8

@export_file("*.glsl") var shader_path: String
@export var resolution: int = 0

var resoult: Texture3D

func _ready() -> void:
	resoult = compute(resolution)

func compute(res: int) -> Texture3D:
	var rd: RenderingDevice = RenderingServer.create_local_rendering_device()
	
	var shader_file: RDShaderFile = load(shader_path)
	var shader_spirv: RDShaderSPIRV = shader_file.get_spirv()
	var shader: RID = rd.shader_create_from_spirv(shader_spirv)
	
	#OUTPUT TEXTURE
	var tex_format := RDTextureFormat.new()
	
	tex_format.format = RenderingDevice.DATA_FORMAT_R8_UNORM
	
	tex_format.width = res
	tex_format.height = res
	tex_format.depth = res
	
	tex_format.usage_bits = \
	RenderingDevice.TEXTURE_USAGE_SAMPLING_BIT +\
	RenderingDevice.TEXTURE_USAGE_STORAGE_BIT +\
	RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT
	
	tex_format.texture_type = RenderingDevice.TEXTURE_TYPE_3D
	
	var texture: RID = rd.texture_create(tex_format, RDTextureView.new())
	
	var uniform_out := RDUniform.new()
	uniform_out.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
	uniform_out.binding = 0
	uniform_out.add_id(texture)
	
	
	
	var uniform_set: RID = rd.uniform_set_create([uniform_out], shader, 0)
	
	var pipeline: RID = rd.compute_pipeline_create(shader)
	
	var compute_list: int = rd.compute_list_begin()
	rd.compute_list_bind_compute_pipeline(compute_list, pipeline)
	rd.compute_list_bind_uniform_set(compute_list, uniform_set, 0)
	var workgroups: int = ceili(res/8.0)
	rd.compute_list_dispatch(compute_list, workgroups, workgroups, workgroups)
	rd.compute_list_end()
	
	rd.submit()
	rd.sync()
	
	
	var data: Array[Image] = RenderingServer.texture_3d_get(texture)
	
	print(rd.texture_is_valid(texture))
	
	var tex := ImageTexture3D.new()
	tex.create(IMAGE_FORMAT, res, res, res, false, data)
	
	rd.free_rid(shader)
	rd.free_rid(texture)
	rd.free_rid(uniform_set)
	rd.free_rid(pipeline)
	
	rd.free()
	
	return tex

And the compute shader:

#[compute]
#version 450

layout(local_size_x = 8, local_size_y = 8, local_size_z = 8) in;

layout(r8, binding = 0) restrict uniform image3D output_texture;

void main() {
    imageStore(output_texture, ivec3(gl_GlobalInvocationID), vec4(0.5,0.0,0.0,0.0));
}

But when I run the project, it returns the following error:

E 0:00:01:140 node.gd:61 @ compute(): Parameter “tex” is null.
<C++ Source> servers/rendering/renderer_rd/storage_rd/texture_storage.cpp:1514 @ texture_3d_get()
node.gd:61 @ compute()
node.gd:11 @ _ready()

and a nothing is returned.
It seems like it’s impossible for it to retrieve the data from the texture, but I have no idea at all why it isn’t working
How can I fix this?
Thanks in advance

Ok I got it to work
I just used texture2Dlayered instead of texture3D in the compute shader and then converted it back to texture3D

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