material-maker/test_rendering.gd

147 lines
5.1 KiB
GDScript

extends Panel
@onready var texture_rect = $VBoxContainer/TextureRect
var computeSrc : String = "#version 450
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(set = 0, binding = 0, rgba16f) uniform image2D OUTPUT_TEXTURE;
layout(set = 1, binding = 0, std430) restrict buffer Parameters {
float p_o9044_columns;
float p_o9044_rows;
float p_o9044_width_x;
float p_o9044_width_y;
float p_o9044_stitch;
};
float dot2(vec2 x) {
return dot(x, x);
}
float rand(vec2 x) {
return fract(cos(mod(dot(x, vec2(13.9898, 8.141)), 3.14)) * 43758.5453);
}
vec2 rand2(vec2 x) {
return fract(cos(mod(vec2(dot(x, vec2(13.9898, 8.141)),
dot(x, vec2(3.4562, 17.398))), vec2(3.14))) * 43758.5453);
}
vec3 rand3(vec2 x) {
return fract(cos(mod(vec3(dot(x, vec2(13.9898, 8.141)),
dot(x, vec2(3.4562, 17.398)),
dot(x, vec2(13.254, 5.867))), vec3(3.14))) * 43758.5453);
}
vec3 rgb2hsv(vec3 c) {
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
vec4 p = c.g < c.b ? vec4(c.bg, K.wz) : vec4(c.gb, K.xy);
vec4 q = c.r < p.x ? vec4(p.xyw, c.r) : vec4(c.r, p.yzx);
float d = q.x - min(q.w, q.y);
float e = 1.0e-10;
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
vec3 hsv2rgb(vec3 c) {
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}
float param_rnd(float minimum, float maximum, float seed) {
return minimum+(maximum-minimum)*rand(vec2(seed));
}
vec3 weave(vec2 uv, vec2 count, float stitch, float width_x, float width_y) {
uv *= stitch;
uv *= count;
float c1 = (sin( 3.1415926 / stitch * (uv.x + floor(uv.y) - (stitch - 1.0))) * 0.25 + 0.75 ) *step(abs(fract(uv.y)-0.5), width_x*0.5);
float c2 = (sin(3.1415926 / stitch * (1.0+uv.y+floor(uv.x) ))* 0.25 + 0.75 )*step(abs(fract(uv.x)-0.5), width_y*0.5);
return vec3(max(c1, c2), 1.0-step(c1, c2), 1.0-step(c2, c1));
}
void main() {
float _seed_variation_ = 0.0;
vec2 UV = (gl_GlobalInvocationID.xy+0.5)/imageSize(OUTPUT_TEXTURE);
vec3 o9044_0 = weave((UV), vec2(p_o9044_columns, p_o9044_rows), p_o9044_stitch, p_o9044_width_x*1.0, p_o9044_width_y*1.0);float o9044_0_2_f = o9044_0.x;
vec4 outColor = vec4(vec3(o9044_0_2_f), 1.0);
imageStore(OUTPUT_TEXTURE, ivec2(gl_GlobalInvocationID.xy), outColor);
}"
var framebuffer: RID
var pipeline: RID
var shader: RID
var img_texture: RID
var clearColors := PackedColorArray([Color.TRANSPARENT])
@onready var rd := RenderingServer.create_local_rendering_device()
const IMAGE_SIZE = 512
func _ready():
update()
func update_compute():
var src : RDShaderSource = RDShaderSource.new()
src.source_compute = computeSrc
var spirv : RDShaderSPIRV = rd.shader_compile_spirv_from_source(src)
print(spirv.compile_error_compute)
shader = rd.shader_create_from_spirv(spirv)
var fmt := RDTextureFormat.new()
fmt.width = IMAGE_SIZE
fmt.height = IMAGE_SIZE
fmt.format = RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT
fmt.usage_bits = RenderingDevice.TEXTURE_USAGE_CAN_UPDATE_BIT | RenderingDevice.TEXTURE_USAGE_STORAGE_BIT | RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT
var view = RDTextureView.new()
var output_image := Image.create(IMAGE_SIZE, IMAGE_SIZE, false, Image.FORMAT_RGBAH)
var output_tex = rd.texture_create(fmt, view, [ output_image.get_data() ])
var output_tex_uniform := RDUniform.new()
output_tex_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
output_tex_uniform.binding = 0
output_tex_uniform.add_id(output_tex)
var uniform_set_0 = rd.uniform_set_create([output_tex_uniform], shader, 0)
var parameters_values : PackedFloat32Array = PackedFloat32Array()
parameters_values.append(%Columns.value)
parameters_values.append(%Rows.value)
parameters_values.append(%WidthX.value)
parameters_values.append(%WidthY.value)
parameters_values.append(%Stitch.value)
var parameters_bytes : PackedByteArray = parameters_values.to_byte_array()
var parameters_buffer = rd.storage_buffer_create(parameters_bytes.size(), parameters_bytes)
var parameters_uniform := RDUniform.new()
parameters_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_STORAGE_BUFFER
parameters_uniform.binding = 0
parameters_uniform.add_id(parameters_buffer)
var uniform_set_1 = rd.uniform_set_create([parameters_uniform], shader, 1)
# Create a compute pipeline
pipeline = rd.compute_pipeline_create(shader)
var compute_list := rd.compute_list_begin()
rd.compute_list_bind_compute_pipeline(compute_list, pipeline)
rd.compute_list_bind_uniform_set(compute_list, uniform_set_0, 0)
rd.compute_list_bind_uniform_set(compute_list, uniform_set_1, 1)
rd.compute_list_dispatch(compute_list, IMAGE_SIZE, IMAGE_SIZE, 1)
rd.compute_list_end()
#rd.submit()
#rd.sync()
var byte_data : PackedByteArray = rd.texture_get_data(output_tex, 0)
var image : Image = Image.create_from_data(IMAGE_SIZE, IMAGE_SIZE, false, Image.FORMAT_RGBAH, byte_data)
texture_rect.texture = ImageTexture.create_from_image(image)
print("hello")
func update(_x : float = 0.0):
update_compute()
func _exit_tree():
rd.free_rid(pipeline)
rd.free_rid(framebuffer)
rd.free_rid(shader)
rd.free_rid(img_texture)