From e7ebdac09e17729817ee797473afc98d9b47a56f Mon Sep 17 00:00:00 2001 From: sphynx-owner Date: Sun, 25 Aug 2024 15:00:16 +0300 Subject: [PATCH] introduced frame independence to guertin implementation --- .../guertin_experimental_blur.glsl | 10 ++++----- .../Guertin/guertin_motion_blur.gd | 22 ++++++++++++++++++- .../Guertin/new_guertin_motion_blur.gd | 22 ++++++++++++++++++- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/addons/SphynxMotionBlurToolkit/Guertin/ShaderFiles/guertin_experimental_blur.glsl b/addons/SphynxMotionBlurToolkit/Guertin/ShaderFiles/guertin_experimental_blur.glsl index 4373dad..9426c3f 100644 --- a/addons/SphynxMotionBlurToolkit/Guertin/ShaderFiles/guertin_experimental_blur.glsl +++ b/addons/SphynxMotionBlurToolkit/Guertin/ShaderFiles/guertin_experimental_blur.glsl @@ -101,13 +101,15 @@ void main() vec4 base_color = textureLod(color_sampler, x, 0.0); + vec4 vxzw = textureLod(velocity_sampler, x, 0.0) * vec4(render_size / 2., 1, 1) * params.motion_blur_intensity; + if(vn_length < 0.5) { imageStore(output_color, uvi, base_color); #ifdef DEBUG imageStore(debug_1_image, uvi, base_color); imageStore(debug_2_image, uvi, vec4(vn / render_size * 2, 0, 1)); - imageStore(debug_3_image, uvi, vec4(0)); + imageStore(debug_3_image, uvi, vec4(vxzw.xy / render_size * 2, 0, 1)); imageStore(debug_4_image, uvi, vec4(0)); #endif return; @@ -115,8 +117,6 @@ void main() vec2 wn = safenorm(vn); - vec4 vxzw = textureLod(velocity_sampler, x, 0.0) * vec4(render_size / 2., 1, 1) * params.motion_blur_intensity; - vec2 vx = vxzw.xy; float vx_length = max(0.5, length(vx)); @@ -192,9 +192,9 @@ void main() imageStore(output_color, uvi, sum); #ifdef DEBUG - imageStore(debug_1_image, uvi, sum); + imageStore(debug_1_image, uvi, base_color); imageStore(debug_2_image, uvi, vec4(vn / render_size * 2, 0, 1)); - imageStore(debug_3_image, uvi, vnzw); + imageStore(debug_3_image, uvi, vec4(vx / render_size * 2, 0, 1)); imageStore(debug_4_image, uvi, vxzw); #endif } \ No newline at end of file diff --git a/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd b/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd index 4c53e17..897d178 100644 --- a/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd +++ b/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd @@ -55,7 +55,27 @@ var freeze : bool = false func _get_max_dilation_range() -> float: return tile_size; +var temp_intensity : float + +var previous_time : float = 0 + func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSceneBuffersRD, render_scene_data : RenderSceneDataRD): + var time : float = float(Time.get_ticks_msec()) / 1000 + + var delta_time : float = time - previous_time + + previous_time = time + + temp_intensity = intensity + + if framerate_independent: + var capped_frame_time : float = 1 / target_constant_framerate + + if !uncapped_independence: + capped_frame_time = min(capped_frame_time, delta_time) + + temp_intensity = intensity * capped_frame_time / delta_time + ensure_texture(tile_max_x, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1.)) ensure_texture(tile_max, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1. / tile_size)) ensure_texture(neighbor_max, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1. / tile_size)) @@ -129,7 +149,7 @@ func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSce minimum_user_threshold, importance_bias, maximum_jitter_value, - intensity, + temp_intensity, ] var int_blur_push_constants : PackedInt32Array = [ tile_size, diff --git a/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd b/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd index dcbbb39..b3d0b7e 100644 --- a/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd +++ b/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd @@ -55,7 +55,27 @@ var freeze : bool = false func _get_max_dilation_range() -> float: return tile_size; +var temp_intensity : float + +var previous_time : float = 0 + func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSceneBuffersRD, render_scene_data : RenderSceneDataRD): + var time : float = float(Time.get_ticks_msec()) / 1000 + + var delta_time : float = time - previous_time + + previous_time = time + + temp_intensity = intensity + + if framerate_independent: + var capped_frame_time : float = 1 / target_constant_framerate + + if !uncapped_independence: + capped_frame_time = min(capped_frame_time, delta_time) + + temp_intensity = intensity * capped_frame_time / delta_time + ensure_texture(tile_max_x, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1.)) ensure_texture(tile_max, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1. / tile_size)) ensure_texture(neighbor_max, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1. / tile_size)) @@ -129,7 +149,7 @@ func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSce minimum_user_threshold, importance_bias, maximum_jitter_value, - intensity, + temp_intensity, ] var int_blur_push_constants : PackedInt32Array = [ tile_size,