Skip to content

Commit 1ce1aa2

Browse files
committed
Modify shader example to show using build in includes
1 parent fa6061c commit 1ce1aa2

File tree

4 files changed

+62
-13
lines changed

4 files changed

+62
-13
lines changed

compute/post_shader/main.gd

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,3 @@ Shader effect: %s
2020
"Enabled" if compositor.compositor_effects[0].enabled else "Disabled",
2121
"Enabled" if compositor.compositor_effects[1].enabled else "Disabled",
2222
]
23-

compute/post_shader/main.tscn

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@ effect_callback_type = 4
3535
needs_motion_vectors = false
3636
needs_normal_roughness = false
3737
script = ExtResource("1_rkpno")
38-
shader_code = " // Invert color.
39-
color.rgb = vec3(1.0 - color.r, 1.0 - color.g, 1.0 - color.b);
38+
shader_code = "// Unproject
39+
vec4 unproj = vec4(uv_norm * 2.0 - 1.0, depth, 1.0);
40+
mat4 inv_projection_matrix = scene_data_block.data.inv_projection_matrix_view[view];
41+
vec4 vertex = inv_projection_matrix * unproj;
42+
vertex.xyz = vertex.xyz / vertex.w;
43+
44+
color.rgb = clamp(vec3(vertex.x/20.0, vertex.y/20.0, -vertex.z/20.0), 0.0, 1.0);
4045
"
4146

4247
[sub_resource type="Compositor" id="Compositor_xxhi4"]

compute/post_shader/post_process_shader.gd

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,44 @@ class_name PostProcessShader
44

55
const template_shader := """#version 450
66
7+
#define MAX_VIEWS 2
8+
9+
#include "scene_data_inc.glsl"
10+
711
// Invocations in the (x, y, z) dimension.
812
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
913
10-
layout(rgba16f, set = 0, binding = 0) uniform image2D color_image;
14+
layout(set = 0, binding = 0, std140) uniform SceneDataBlock {
15+
SceneData data;
16+
SceneData prev_data;
17+
}
18+
scene_data_block;
19+
20+
layout(rgba16f, set = 0, binding = 1) uniform image2D color_image;
21+
layout(set = 0, binding = 2) uniform sampler2D depth_texture;
1122
1223
// Our push constant.
1324
// Must be aligned to 16 bytes, just like the push constant we passed from the script.
1425
layout(push_constant, std430) uniform Params {
1526
vec2 raster_size;
16-
vec2 pad;
27+
float view;
28+
float pad;
1729
} params;
1830
1931
// The code we want to execute in each invocation.
2032
void main() {
2133
ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
2234
ivec2 size = ivec2(params.raster_size);
35+
int view = int(params.view);
2336
2437
if (uv.x >= size.x || uv.y >= size.y) {
2538
return;
2639
}
2740
41+
vec2 uv_norm = vec2(uv) / params.raster_size;
42+
2843
vec4 color = imageLoad(color_image, uv);
44+
float depth = texture(depth_texture, uv_norm).r;
2945
3046
#COMPUTE_CODE
3147
@@ -42,6 +58,7 @@ void main() {
4258
var rd: RenderingDevice
4359
var shader: RID
4460
var pipeline: RID
61+
var nearest_sampler : RID
4562

4663
var mutex := Mutex.new()
4764
var shader_is_dirty := true
@@ -59,6 +76,8 @@ func _notification(what: int) -> void:
5976
if shader.is_valid():
6077
# Freeing our shader will also free any dependents such as the pipeline!
6178
RenderingServer.free_rid(shader)
79+
if nearest_sampler.is_valid():
80+
rd.free_rid(nearest_sampler)
6281

6382

6483
#region Code in this region runs on the rendering thread.
@@ -115,7 +134,8 @@ func _render_callback(p_effect_callback_type: EffectCallbackType, p_render_data:
115134
# Get our render scene buffers object, this gives us access to our render buffers.
116135
# Note that implementation differs per renderer hence the need for the cast.
117136
var render_scene_buffers := p_render_data.get_render_scene_buffers()
118-
if render_scene_buffers:
137+
var scene_data := p_render_data.get_render_scene_data()
138+
if render_scene_buffers && scene_data:
119139
# Get our render size, this is the 3D render resolution!
120140
var size: Vector2i = render_scene_buffers.get_internal_size()
121141
if size.x == 0 and size.y == 0:
@@ -137,18 +157,43 @@ func _render_callback(p_effect_callback_type: EffectCallbackType, p_render_data:
137157
0.0,
138158
])
139159

160+
# Make sure we have a sampler
161+
if not nearest_sampler.is_valid():
162+
var sampler_state : RDSamplerState = RDSamplerState.new()
163+
sampler_state.min_filter = RenderingDevice.SAMPLER_FILTER_NEAREST
164+
sampler_state.mag_filter = RenderingDevice.SAMPLER_FILTER_NEAREST
165+
nearest_sampler = rd.sampler_create(sampler_state)
166+
140167
# Loop through views just in case we're doing stereo rendering. No extra cost if this is mono.
141168
var view_count: int = render_scene_buffers.get_view_count()
142169
for view in view_count:
170+
# Get the RID for our scene data buffer
171+
var scene_data_buffers: RID = scene_data.get_uniform_buffer()
172+
143173
# Get the RID for our color image, we will be reading from and writing to it.
144-
var input_image: RID = render_scene_buffers.get_color_layer(view)
174+
var color_image: RID = render_scene_buffers.get_color_layer(view)
175+
176+
# Get the RID for our depth image, we will be reading from it.
177+
var depth_image: RID = render_scene_buffers.get_depth_layer(view)
145178

146179
# Create a uniform set, this will be cached, the cache will be cleared if our viewports configuration is changed.
147-
var uniform := RDUniform.new()
148-
uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
149-
uniform.binding = 0
150-
uniform.add_id(input_image)
151-
var uniform_set := UniformSetCacheRD.get_cache(shader, 0, [uniform])
180+
var scene_data_uniform := RDUniform.new()
181+
scene_data_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_UNIFORM_BUFFER
182+
scene_data_uniform.binding = 0
183+
scene_data_uniform.add_id(scene_data_buffers)
184+
var color_uniform := RDUniform.new()
185+
color_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
186+
color_uniform.binding = 1
187+
color_uniform.add_id(color_image)
188+
var depth_uniform := RDUniform.new()
189+
depth_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_SAMPLER_WITH_TEXTURE
190+
depth_uniform.binding = 2
191+
depth_uniform.add_id(nearest_sampler)
192+
depth_uniform.add_id(depth_image)
193+
var uniform_set := UniformSetCacheRD.get_cache(shader, 0, [scene_data_uniform, color_uniform, depth_uniform])
194+
195+
# Set our view
196+
push_constant[2] = view
152197

153198
# Run our compute shader.
154199
var compute_list := rd.compute_list_begin()

compute/post_shader/project.godot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ config_version=5
1212

1313
config/name="Compositor Effects (Post-Processing)"
1414
run/main_scene="res://main.tscn"
15-
config/features=PackedStringArray("4.3", "Forward Plus")
15+
config/features=PackedStringArray("4.4", "Forward Plus")
1616
config/icon="res://icon.svg"
1717

1818
[debug]

0 commit comments

Comments
 (0)