Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify shader example to show using build in includes #1086

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion compute/post_shader/main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@ Shader effect: %s
"Enabled" if compositor.compositor_effects[0].enabled else "Disabled",
"Enabled" if compositor.compositor_effects[1].enabled else "Disabled",
]

9 changes: 7 additions & 2 deletions compute/post_shader/main.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ effect_callback_type = 4
needs_motion_vectors = false
needs_normal_roughness = false
script = ExtResource("1_rkpno")
shader_code = " // Invert color.
color.rgb = vec3(1.0 - color.r, 1.0 - color.g, 1.0 - color.b);
shader_code = "// Unproject
vec4 unproj = vec4(uv_norm * 2.0 - 1.0, depth, 1.0);
mat4 inv_projection_matrix = scene_data_block.data.inv_projection_matrix_view[view];
vec4 vertex = inv_projection_matrix * unproj;
vertex.xyz = vertex.xyz / vertex.w;

color.rgb = clamp(vec3(vertex.x/20.0, vertex.y/20.0, -vertex.z/20.0), 0.0, 1.0);
"

[sub_resource type="Compositor" id="Compositor_xxhi4"]
Expand Down
65 changes: 55 additions & 10 deletions compute/post_shader/post_process_shader.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,44 @@ class_name PostProcessShader

const template_shader := """#version 450

#define MAX_VIEWS 2

#include "godot/scene_data_inc.glsl"

// Invocations in the (x, y, z) dimension.
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

layout(rgba16f, set = 0, binding = 0) uniform image2D color_image;
layout(set = 0, binding = 0, std140) uniform SceneDataBlock {
SceneData data;
SceneData prev_data;
}
scene_data_block;

layout(rgba16f, set = 0, binding = 1) uniform image2D color_image;
layout(set = 0, binding = 2) uniform sampler2D depth_texture;

// Our push constant.
// Must be aligned to 16 bytes, just like the push constant we passed from the script.
layout(push_constant, std430) uniform Params {
vec2 raster_size;
vec2 pad;
float view;
float pad;
} params;

// The code we want to execute in each invocation.
void main() {
ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
ivec2 size = ivec2(params.raster_size);
int view = int(params.view);

if (uv.x >= size.x || uv.y >= size.y) {
return;
}

vec2 uv_norm = vec2(uv) / params.raster_size;

vec4 color = imageLoad(color_image, uv);
float depth = texture(depth_texture, uv_norm).r;

#COMPUTE_CODE

Expand All @@ -42,6 +58,7 @@ void main() {
var rd: RenderingDevice
var shader: RID
var pipeline: RID
var nearest_sampler : RID

var mutex := Mutex.new()
var shader_is_dirty := true
Expand All @@ -58,7 +75,9 @@ func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
if shader.is_valid():
# Freeing our shader will also free any dependents such as the pipeline!
rd.free_rid(shader)
RenderingServer.free_rid(shader)
if nearest_sampler.is_valid():
rd.free_rid(nearest_sampler)


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

# Make sure we have a sampler
if not nearest_sampler.is_valid():
var sampler_state : RDSamplerState = RDSamplerState.new()
sampler_state.min_filter = RenderingDevice.SAMPLER_FILTER_NEAREST
sampler_state.mag_filter = RenderingDevice.SAMPLER_FILTER_NEAREST
nearest_sampler = rd.sampler_create(sampler_state)

# Loop through views just in case we're doing stereo rendering. No extra cost if this is mono.
var view_count: int = render_scene_buffers.get_view_count()
for view in view_count:
# Get the RID for our scene data buffer
var scene_data_buffers: RID = scene_data.get_uniform_buffer()

# Get the RID for our color image, we will be reading from and writing to it.
var input_image: RID = render_scene_buffers.get_color_layer(view)
var color_image: RID = render_scene_buffers.get_color_layer(view)

# Get the RID for our depth image, we will be reading from it.
var depth_image: RID = render_scene_buffers.get_depth_layer(view)

# Create a uniform set, this will be cached, the cache will be cleared if our viewports configuration is changed.
var uniform := RDUniform.new()
uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform.binding = 0
uniform.add_id(input_image)
var uniform_set := UniformSetCacheRD.get_cache(shader, 0, [uniform])
var scene_data_uniform := RDUniform.new()
scene_data_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_UNIFORM_BUFFER
scene_data_uniform.binding = 0
scene_data_uniform.add_id(scene_data_buffers)
var color_uniform := RDUniform.new()
color_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
color_uniform.binding = 1
color_uniform.add_id(color_image)
var depth_uniform := RDUniform.new()
depth_uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_SAMPLER_WITH_TEXTURE
depth_uniform.binding = 2
depth_uniform.add_id(nearest_sampler)
depth_uniform.add_id(depth_image)
var uniform_set := UniformSetCacheRD.get_cache(shader, 0, [scene_data_uniform, color_uniform, depth_uniform])

# Set our view
push_constant[2] = view

# Run our compute shader.
var compute_list := rd.compute_list_begin()
Expand Down
6 changes: 3 additions & 3 deletions compute/post_shader/project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ config_version=5

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

[debug]
Expand All @@ -28,12 +28,12 @@ window/stretch/aspect="expand"

toggle_grayscale_effect={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":103,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-3,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":103,"location":0,"echo":false,"script":null)
]
}
toggle_shader_effect={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-3,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}

Expand Down