Compile shader code from shader file

This commit is contained in:
Garrett Gunnell 2024-12-05 04:01:48 -08:00
parent c7afbd91b7
commit b86af22ea4
4 changed files with 66 additions and 36 deletions

View file

@ -0,0 +1,27 @@
#version 450
// Invocations in the (x, y, z) dimension (thread group sizes)
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(rgba16f, set = 0, binding = 0) uniform image2D color_image;
// Our push constant (cbuffer??)
layout(push_constant, std430) uniform Params {
vec2 raster_size;
vec2 reserved;
vec4 exposure;
} params;
// main function/kernel?
void main() {
ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
ivec2 size = ivec2(params.raster_size);
if (uv.x >= size.x || uv.y >= size.y) return;
vec4 color = imageLoad(color_image, uv);
color.rgb *= params.exposure.rgb + params.reserved.x + params.reserved.y;
imageStore(color_image, uv, color);
}

View file

@ -0,0 +1,14 @@
[remap]
importer="glsl"
type="RDShaderFile"
uid="uid://cm55eusukipw2"
path="res://.godot/imported/color_correct.glsl-1582275ca0edaf6a86c2560486d8f577.res"
[deps]
source_file="res://Shaders/color_correct.glsl"
dest_files=["res://.godot/imported/color_correct.glsl-1582275ca0edaf6a86c2560486d8f577.res"]
[params]

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=3 uid="uid://ccgywstxl3rj6"]
[gd_scene load_steps=9 format=3 uid="uid://ccgywstxl3rj6"]
[ext_resource type="Script" path="res://post_process_shader.gd" id="1_g22wf"]
[ext_resource type="Texture2D" uid="uid://c6jccoq62id4d" path="res://Ignored/tumblr_280d93eb9dac421ba08746f2d5362045_8c4f7d77_1280.jpg" id="2_lxnnh"]
@ -13,10 +13,22 @@ effect_callback_type = 4
needs_motion_vectors = false
needs_normal_roughness = false
script = ExtResource("1_g22wf")
exposure = Vector3(0, 0, 0)
shader_file_path = "res://Shaders/color_correct.glsl"
exposure = Vector3(2.57, 1, 1)
[sub_resource type="CompositorEffect" id="CompositorEffect_eje4o"]
resource_local_to_scene = false
resource_name = ""
enabled = true
effect_callback_type = 4
needs_motion_vectors = false
needs_normal_roughness = false
script = ExtResource("1_g22wf")
shader_file_path = "res://Shaders/color_correct.glsl"
exposure = Vector3(1, 2.105, 1)
[sub_resource type="Compositor" id="Compositor_4ipny"]
compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_6lq7a")])
compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_6lq7a"), SubResource("CompositorEffect_eje4o")])
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_in1jo"]
shading_mode = 0

View file

@ -2,34 +2,7 @@
extends CompositorEffect
class_name PostProcessShader
const template_shader : String = "#version 450
// Invocations in the (x, y, z) dimension (thread group sizes)
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(rgba16f, set = 0, binding = 0) uniform image2D color_image;
// Our push constant (cbuffer??)
layout(push_constant, std430) uniform Params {
vec2 raster_size;
vec2 reserved;
vec4 exposure;
} params;
// main function/kernel?
void main() {
ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
ivec2 size = ivec2(params.raster_size);
if (uv.x >= size.x || uv.y >= size.y) return;
vec4 color = imageLoad(color_image, uv);
color.rgb *= params.exposure.rgb + params.reserved.x + params.reserved.y;
imageStore(color_image, uv, color);
}
"
@export_file("*.glsl") var shader_file_path
@export_group("Shader Settings")
@export var exposure : Vector3
@ -58,22 +31,26 @@ func _check_shader() -> bool:
var new_shader_code : String = ""
var shader_file = FileAccess.open(shader_file_path, FileAccess.READ)
var shader_code = shader_file.get_as_text()
mutex.lock()
if shader_is_dirty:
new_shader_code = template_shader
new_shader_code = shader_code
shader_is_dirty = false
mutex.unlock()
if new_shader_code.is_empty():
return pipeline.is_valid()
new_shader_code = template_shader
new_shader_code = shader_code
if shader.is_valid():
rd.free_rid(shader)
shader = RID()
pipeline = RID()
var shader_source : RDShaderSource = RDShaderSource.new()
shader_source.language = RenderingDevice.SHADER_LANGUAGE_GLSL
shader_source.source_compute = new_shader_code
@ -92,7 +69,7 @@ func _check_shader() -> bool:
return pipeline.is_valid()
func _render_callback(p_effect_callback_type, p_render_data):
if rd and p_effect_callback_type == EFFECT_CALLBACK_TYPE_POST_TRANSPARENT and _check_shader():
if enabled and rd and p_effect_callback_type == EFFECT_CALLBACK_TYPE_POST_TRANSPARENT and _check_shader():
var render_scene_buffers : RenderSceneBuffersRD = p_render_data.get_render_scene_buffers()
if render_scene_buffers:
var size = render_scene_buffers.get_internal_size()