From 96886a7b13346973eb2b1dec423861b55bd24b0d Mon Sep 17 00:00:00 2001 From: sphynx-owner Date: Sun, 25 Aug 2024 18:50:52 +0300 Subject: [PATCH] restructure of compositor and fix inconsistencies --- .../BaseClasses/mb_compositor.gd | 49 +++++++++++++++++++ .../BaseClasses/mb_compositor_effect.gd | 17 +++---- .../Guertin/guertin_motion_blur.gd | 3 -- .../Guertin/new_guertin_motion_blur.gd | 3 -- .../McGuire/mcguire_motion_blur.gd | 3 -- .../Shaders/pre_blur_processor.glsl | 10 ++-- .../PreBlurProcessing/pre_blur_processor.gd | 27 +++++++--- 7 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor.gd diff --git a/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor.gd b/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor.gd new file mode 100644 index 0000000..21b64a0 --- /dev/null +++ b/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor.gd @@ -0,0 +1,49 @@ +extends Compositor +class_name MotionBlurCompositor + +@export_group("Motion Blur") +# diminishing returns over 16 +@export_range(4, 64) var samples: int = 16 : + set(value): + for effect in compositor_effects: + effect.set("samples", value) + samples = value +# you really don't want this over 0.5, but you can if you want to try +@export_range(0, 0.5, 0.001, "or_greater") var intensity: float = 1 : + set(value): + for effect in compositor_effects: + effect.set("intensity", value) + intensity = value +@export_range(0, 1) var center_fade: float = 0.0 : + set(value): + for effect in compositor_effects: + effect.set("center_fade", value) + center_fade = value + +## wether this motion blur stays the same intensity below +## target_constant_framerate +@export var framerate_independent : bool = true : + set(value): + for effect in compositor_effects: + effect.set("framerate_independent", value) + framerate_independent = value + +## Description: Removes clamping on motion blur scale to allow framerate independent motion +## blur to scale longer than realistically possible when render framerate is higher +## than target framerate.[br][br] +## [color=yellow]Warning:[/color] Turning this on would allow over-blurring of pixels, which +## produces inaccurate results, and would likely cause nausea in players over +## long exposure durations, use with caution and out of artistic intent +@export var uncapped_independence : bool = false : + set(value): + for effect in compositor_effects: + effect.set("uncapped_independence", value) + uncapped_independence = value + +## if framerate_independent is enabled, the blur would simulate +## sutter speeds at that framerate, and up. +@export var target_constant_framerate : float = 30 : + set(value): + for effect in compositor_effects: + effect.set("target_constant_framerate", value) + target_constant_framerate = value diff --git a/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor_effect.gd b/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor_effect.gd index bc2743c..a049ebb 100644 --- a/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor_effect.gd +++ b/addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor_effect.gd @@ -1,15 +1,14 @@ extends "res://addons/SphynxMotionBlurToolkit/BaseClasses/enhanced_compositor_effect.gd" -@export_group("Motion Blur") # diminishing returns over 16 -@export_range(4, 64) var samples: int = 16 +var samples: int = 16 # you really don't want this over 0.5, but you can if you want to try -@export_range(0, 0.5, 0.001, "or_greater") var intensity: float = 1 -@export_range(0, 1) var center_fade: float = 0.0 +var intensity: float = 1 +var center_fade: float = 0.0 ## wether this motion blur stays the same intensity below ## target_constant_framerate -@export var framerate_independent : bool = true +var framerate_independent : bool = true ## Description: Removes clamping on motion blur scale to allow framerate independent motion ## blur to scale longer than realistically possible when render framerate is higher @@ -17,15 +16,13 @@ extends "res://addons/SphynxMotionBlurToolkit/BaseClasses/enhanced_compositor_ef ## [color=yellow]Warning:[/color] Turning this on would allow over-blurring of pixels, which ## produces inaccurate results, and would likely cause nausea in players over ## long exposure durations, use with caution and out of artistic intent -@export var uncapped_independence : bool = false +var uncapped_independence : bool = false ## if framerate_independent is enabled, the blur would simulate ## sutter speeds at that framerate, and up. -@export var target_constant_framerate : float = 30 +var target_constant_framerate : float = 30 func _init(): + needs_motion_vectors = true set_deferred("context", "MotionBlur") super() - -func _get_max_dilation_range() -> float: - return 0 diff --git a/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd b/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd index 897d178..2f43539 100644 --- a/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd +++ b/addons/SphynxMotionBlurToolkit/Guertin/guertin_motion_blur.gd @@ -52,9 +52,6 @@ var custom_velocity : StringName = "custom_velocity" var freeze : bool = false -func _get_max_dilation_range() -> float: - return tile_size; - var temp_intensity : float var previous_time : float = 0 diff --git a/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd b/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd index b3d0b7e..ea42e23 100644 --- a/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd +++ b/addons/SphynxMotionBlurToolkit/Guertin/new_guertin_motion_blur.gd @@ -52,9 +52,6 @@ var custom_velocity : StringName = "custom_velocity" var freeze : bool = false -func _get_max_dilation_range() -> float: - return tile_size; - var temp_intensity : float var previous_time : float = 0 diff --git a/addons/SphynxMotionBlurToolkit/McGuire/mcguire_motion_blur.gd b/addons/SphynxMotionBlurToolkit/McGuire/mcguire_motion_blur.gd index 49e8e2d..1a95dc6 100644 --- a/addons/SphynxMotionBlurToolkit/McGuire/mcguire_motion_blur.gd +++ b/addons/SphynxMotionBlurToolkit/McGuire/mcguire_motion_blur.gd @@ -54,9 +54,6 @@ var custom_velocity : StringName = "custom_velocity" var freeze : bool = false -func _get_max_dilation_range() -> float: - return tile_size; - func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSceneBuffersRD, render_scene_data : RenderSceneDataRD): 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)) diff --git a/addons/SphynxMotionBlurToolkit/PreBlurProcessing/Shaders/pre_blur_processor.glsl b/addons/SphynxMotionBlurToolkit/PreBlurProcessing/Shaders/pre_blur_processor.glsl index d0fa571..9c400f2 100644 --- a/addons/SphynxMotionBlurToolkit/PreBlurProcessing/Shaders/pre_blur_processor.glsl +++ b/addons/SphynxMotionBlurToolkit/PreBlurProcessing/Shaders/pre_blur_processor.glsl @@ -91,7 +91,7 @@ layout(push_constant, std430) uniform Params { float rotation_velocity_multiplier; float movement_velocity_multiplier; - float object_velocity_multilpier; + float object_velocity_multiplier; float rotation_velocity_lower_threshold; float movement_velocity_lower_threshold; float object_velocity_lower_threshold; @@ -99,7 +99,7 @@ layout(push_constant, std430) uniform Params float movement_velocity_upper_threshold; float object_velocity_upper_threshold; float is_fsr2; - float nan_fl_1; + float motion_blur_intensity; float nan_fl_2; } params; @@ -174,9 +174,9 @@ void main() // get object velocity vec3 object_uv_change = base_velocity - camera_uv_change.xyz; // construct final velocity with user defined weights - vec3 total_velocity = camera_rotation_uv_change * params.rotation_velocity_multiplier * sharp_step(params.rotation_velocity_lower_threshold, params.rotation_velocity_upper_threshold, length(camera_rotation_uv_change)) - + camera_movement_uv_change * params.movement_velocity_multiplier * sharp_step(params.movement_velocity_lower_threshold, params.movement_velocity_upper_threshold, length(camera_movement_uv_change)) - + object_uv_change * params.object_velocity_multilpier * sharp_step(params.object_velocity_lower_threshold, params.object_velocity_upper_threshold, length(object_uv_change)); + vec3 total_velocity = camera_rotation_uv_change * params.rotation_velocity_multiplier * sharp_step(params.rotation_velocity_lower_threshold, params.rotation_velocity_upper_threshold, length(camera_rotation_uv_change) * params.rotation_velocity_multiplier * params.motion_blur_intensity) + + camera_movement_uv_change * params.movement_velocity_multiplier * sharp_step(params.movement_velocity_lower_threshold, params.movement_velocity_upper_threshold, length(camera_movement_uv_change) * params.movement_velocity_multiplier * params.motion_blur_intensity) + + object_uv_change * params.object_velocity_multiplier * sharp_step(params.object_velocity_lower_threshold, params.object_velocity_upper_threshold, length(object_uv_change) * params.object_velocity_multiplier * params.motion_blur_intensity); // if objects move, clear z direction, (z only correct for static environment) if(dot(object_uv_change.xy, object_uv_change.xy) > 0.000001) { diff --git a/addons/SphynxMotionBlurToolkit/PreBlurProcessing/pre_blur_processor.gd b/addons/SphynxMotionBlurToolkit/PreBlurProcessing/pre_blur_processor.gd index 13ba964..eef06ba 100644 --- a/addons/SphynxMotionBlurToolkit/PreBlurProcessing/pre_blur_processor.gd +++ b/addons/SphynxMotionBlurToolkit/PreBlurProcessing/pre_blur_processor.gd @@ -1,4 +1,4 @@ -extends "res://addons/SphynxMotionBlurToolkit/BaseClasses/enhanced_compositor_effect.gd" +extends "res://addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor_effect.gd" class_name PreBlurProcessor @export_group("Shader Stages") @@ -15,12 +15,27 @@ class_name PreBlurProcessor var custom_velocity : StringName = "custom_velocity" -func _init(): - needs_motion_vectors = true - set_deferred("context", "MotionBlur") - super() +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(custom_velocity, render_scene_buffers) rd.draw_command_begin_label("Pre Blur Processing", Color(1.0, 1.0, 1.0, 1.0)) @@ -36,7 +51,7 @@ func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSce camera_movement_component.upper_threshold, object_movement_component.upper_threshold, 1 if true else 0, - 0, + temp_intensity, 0, ]