mirror of
https://github.com/sphynx-owner/JFA_driven_motion_blur_addon.git
synced 2025-09-19 04:06:08 +08:00
restructure of compositor and fix inconsistencies
This commit is contained in:
49
addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor.gd
Normal file
49
addons/SphynxMotionBlurToolkit/BaseClasses/mb_compositor.gd
Normal file
@ -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
|
@ -1,15 +1,14 @@
|
|||||||
extends "res://addons/SphynxMotionBlurToolkit/BaseClasses/enhanced_compositor_effect.gd"
|
extends "res://addons/SphynxMotionBlurToolkit/BaseClasses/enhanced_compositor_effect.gd"
|
||||||
|
|
||||||
@export_group("Motion Blur")
|
|
||||||
# diminishing returns over 16
|
# 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
|
# 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
|
var intensity: float = 1
|
||||||
@export_range(0, 1) var center_fade: float = 0.0
|
var center_fade: float = 0.0
|
||||||
|
|
||||||
## wether this motion blur stays the same intensity below
|
## wether this motion blur stays the same intensity below
|
||||||
## target_constant_framerate
|
## 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
|
## Description: Removes clamping on motion blur scale to allow framerate independent motion
|
||||||
## blur to scale longer than realistically possible when render framerate is higher
|
## 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
|
## [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
|
## produces inaccurate results, and would likely cause nausea in players over
|
||||||
## long exposure durations, use with caution and out of artistic intent
|
## 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
|
## if framerate_independent is enabled, the blur would simulate
|
||||||
## sutter speeds at that framerate, and up.
|
## sutter speeds at that framerate, and up.
|
||||||
@export var target_constant_framerate : float = 30
|
var target_constant_framerate : float = 30
|
||||||
|
|
||||||
func _init():
|
func _init():
|
||||||
|
needs_motion_vectors = true
|
||||||
set_deferred("context", "MotionBlur")
|
set_deferred("context", "MotionBlur")
|
||||||
super()
|
super()
|
||||||
|
|
||||||
func _get_max_dilation_range() -> float:
|
|
||||||
return 0
|
|
||||||
|
@ -52,9 +52,6 @@ var custom_velocity : StringName = "custom_velocity"
|
|||||||
|
|
||||||
var freeze : bool = false
|
var freeze : bool = false
|
||||||
|
|
||||||
func _get_max_dilation_range() -> float:
|
|
||||||
return tile_size;
|
|
||||||
|
|
||||||
var temp_intensity : float
|
var temp_intensity : float
|
||||||
|
|
||||||
var previous_time : float = 0
|
var previous_time : float = 0
|
||||||
|
@ -52,9 +52,6 @@ var custom_velocity : StringName = "custom_velocity"
|
|||||||
|
|
||||||
var freeze : bool = false
|
var freeze : bool = false
|
||||||
|
|
||||||
func _get_max_dilation_range() -> float:
|
|
||||||
return tile_size;
|
|
||||||
|
|
||||||
var temp_intensity : float
|
var temp_intensity : float
|
||||||
|
|
||||||
var previous_time : float = 0
|
var previous_time : float = 0
|
||||||
|
@ -54,9 +54,6 @@ var custom_velocity : StringName = "custom_velocity"
|
|||||||
|
|
||||||
var freeze : bool = false
|
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):
|
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_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(tile_max, render_scene_buffers, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, Vector2(1. / tile_size, 1. / tile_size))
|
||||||
|
@ -91,7 +91,7 @@ layout(push_constant, std430) uniform Params
|
|||||||
{
|
{
|
||||||
float rotation_velocity_multiplier;
|
float rotation_velocity_multiplier;
|
||||||
float movement_velocity_multiplier;
|
float movement_velocity_multiplier;
|
||||||
float object_velocity_multilpier;
|
float object_velocity_multiplier;
|
||||||
float rotation_velocity_lower_threshold;
|
float rotation_velocity_lower_threshold;
|
||||||
float movement_velocity_lower_threshold;
|
float movement_velocity_lower_threshold;
|
||||||
float object_velocity_lower_threshold;
|
float object_velocity_lower_threshold;
|
||||||
@ -99,7 +99,7 @@ layout(push_constant, std430) uniform Params
|
|||||||
float movement_velocity_upper_threshold;
|
float movement_velocity_upper_threshold;
|
||||||
float object_velocity_upper_threshold;
|
float object_velocity_upper_threshold;
|
||||||
float is_fsr2;
|
float is_fsr2;
|
||||||
float nan_fl_1;
|
float motion_blur_intensity;
|
||||||
float nan_fl_2;
|
float nan_fl_2;
|
||||||
} params;
|
} params;
|
||||||
|
|
||||||
@ -174,9 +174,9 @@ void main()
|
|||||||
// get object velocity
|
// get object velocity
|
||||||
vec3 object_uv_change = base_velocity - camera_uv_change.xyz;
|
vec3 object_uv_change = base_velocity - camera_uv_change.xyz;
|
||||||
// construct final velocity with user defined weights
|
// 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))
|
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))
|
+ 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_multilpier * sharp_step(params.object_velocity_lower_threshold, params.object_velocity_upper_threshold, length(object_uv_change));
|
+ 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 objects move, clear z direction, (z only correct for static environment)
|
||||||
if(dot(object_uv_change.xy, object_uv_change.xy) > 0.000001)
|
if(dot(object_uv_change.xy, object_uv_change.xy) > 0.000001)
|
||||||
{
|
{
|
||||||
|
@ -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
|
class_name PreBlurProcessor
|
||||||
|
|
||||||
@export_group("Shader Stages")
|
@export_group("Shader Stages")
|
||||||
@ -15,12 +15,27 @@ class_name PreBlurProcessor
|
|||||||
|
|
||||||
var custom_velocity : StringName = "custom_velocity"
|
var custom_velocity : StringName = "custom_velocity"
|
||||||
|
|
||||||
func _init():
|
var temp_intensity : float
|
||||||
needs_motion_vectors = true
|
|
||||||
set_deferred("context", "MotionBlur")
|
var previous_time : float = 0
|
||||||
super()
|
|
||||||
|
|
||||||
func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSceneBuffersRD, render_scene_data : RenderSceneDataRD):
|
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)
|
ensure_texture(custom_velocity, render_scene_buffers)
|
||||||
|
|
||||||
rd.draw_command_begin_label("Pre Blur Processing", Color(1.0, 1.0, 1.0, 1.0))
|
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,
|
camera_movement_component.upper_threshold,
|
||||||
object_movement_component.upper_threshold,
|
object_movement_component.upper_threshold,
|
||||||
1 if true else 0,
|
1 if true else 0,
|
||||||
0,
|
temp_intensity,
|
||||||
0,
|
0,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user