mirror of
https://github.com/sphynx-owner/JFA_driven_motion_blur_addon.git
synced 2026-10-10 04:03:06 +08:00
Complete overhaul, new implementations
- Overhauled file structure to be on addons for universality - Streamlined compositor shader stages with custom classes and resources - Added previous proven implementations (McGuire, Guertin) - entirely new and improved jump flood implementation, more realistic, robust, and performant
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
#[compute]
|
||||
#version 450
|
||||
|
||||
#define FLT_MAX 3.402823466e+38
|
||||
#define FLT_MIN 1.175494351e-38
|
||||
#define DBL_MAX 1.7976931348623158e+308
|
||||
#define DBL_MIN 2.2250738585072014e-308
|
||||
|
||||
layout(rgba16f, set = 0, binding = 0) uniform image2D past_color_image;
|
||||
layout(rgba16f, set = 0, binding = 1) uniform image2D output_color_image;
|
||||
layout(set = 0, binding = 2) uniform sampler2D color_sampler;
|
||||
layout(set = 0, binding = 3) uniform sampler2D debug_sampler_1;
|
||||
layout(set = 0, binding = 4) uniform sampler2D debug_sampler_2;
|
||||
layout(set = 0, binding = 5) uniform sampler2D debug_sampler_3;
|
||||
layout(set = 0, binding = 6) uniform sampler2D debug_sampler_4;
|
||||
layout(set = 0, binding = 7) uniform sampler2D debug_sampler_5;
|
||||
layout(set = 0, binding = 8) uniform sampler2D debug_sampler_6;
|
||||
layout(set = 0, binding = 9) uniform sampler2D debug_sampler_7;
|
||||
layout(set = 0, binding = 10) uniform sampler2D debug_sampler_8;
|
||||
|
||||
layout(push_constant, std430) uniform Params
|
||||
{
|
||||
float nan_fl_1;
|
||||
float nan_fl_2;
|
||||
float nan_fl_3;
|
||||
float nan_fl_4;
|
||||
int freeze;
|
||||
int draw_debug;
|
||||
int debug_page;
|
||||
int nan3;
|
||||
} params;
|
||||
|
||||
layout(local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
ivec2 render_size = ivec2(textureSize(color_sampler, 0));
|
||||
ivec2 uvi = ivec2(gl_GlobalInvocationID.xy);
|
||||
if ((uvi.x >= render_size.x) || (uvi.y >= render_size.y))
|
||||
{
|
||||
return;
|
||||
}
|
||||
// show past image for freeze frame
|
||||
if(params.freeze > 0)
|
||||
{
|
||||
imageStore(output_color_image, uvi, imageLoad(past_color_image, uvi));
|
||||
return;
|
||||
}
|
||||
// must be on pixel center for whole values (tested)
|
||||
vec2 uvn = vec2(uvi + vec2(0.5)) / render_size;
|
||||
|
||||
vec4 source = textureLod(color_sampler, uvn, 0.0);
|
||||
|
||||
if (params.draw_debug == 0)
|
||||
{
|
||||
imageStore(output_color_image, uvi, source);
|
||||
imageStore(past_color_image, uvi, source);
|
||||
return;
|
||||
}
|
||||
|
||||
vec4 tl_col;
|
||||
|
||||
vec4 tr_col;
|
||||
|
||||
vec4 bl_col;
|
||||
|
||||
vec4 br_col;
|
||||
|
||||
if(params.debug_page == 0)
|
||||
{
|
||||
tl_col = textureLod(debug_sampler_1, uvn, 0.0);
|
||||
tr_col = textureLod(debug_sampler_2, uvn, 0.0);
|
||||
bl_col = textureLod(debug_sampler_3, uvn, 0.0);
|
||||
br_col = textureLod(debug_sampler_4, uvn, 0.0);
|
||||
}
|
||||
if(params.debug_page == 1)
|
||||
{
|
||||
tl_col = textureLod(debug_sampler_5, uvn, 0.0);
|
||||
tr_col = textureLod(debug_sampler_6, uvn, 0.0);
|
||||
bl_col = textureLod(debug_sampler_7, uvn, 0.0);
|
||||
br_col = textureLod(debug_sampler_8, uvn, 0.0);
|
||||
}
|
||||
|
||||
imageStore(output_color_image, uvi / 2, tl_col);
|
||||
imageStore(output_color_image, uvi / 2 + ivec2(vec2(0.5, 0.5) * render_size), br_col);
|
||||
imageStore(output_color_image, uvi / 2 + ivec2(vec2(0.0, 0.5) * render_size), bl_col);
|
||||
imageStore(output_color_image, uvi / 2 + ivec2(vec2(0.5, 0.0) * render_size), tr_col);
|
||||
imageStore(past_color_image, uvi / 2, tl_col);
|
||||
imageStore(past_color_image, uvi / 2 + ivec2(vec2(0.5, 0.5) * render_size), br_col);
|
||||
imageStore(past_color_image, uvi / 2 + ivec2(vec2(0.0, 0.5) * render_size), bl_col);
|
||||
imageStore(past_color_image, uvi / 2 + ivec2(vec2(0.5, 0.0) * render_size), tr_col);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
[remap]
|
||||
|
||||
importer="glsl"
|
||||
type="RDShaderFile"
|
||||
uid="uid://dyxn6g5gvoge7"
|
||||
path="res://.godot/imported/debug_overlay.glsl-5ad15477a64c7f484bc494103ad163b6.res"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/SphynxMotionBlurToolkit/Debug/ShaderFiles/debug_overlay.glsl"
|
||||
dest_files=["res://.godot/imported/debug_overlay.glsl-5ad15477a64c7f484bc494103ad163b6.res"]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ShaderStageResource" load_steps=3 format=3 uid="uid://o2bivm33b0v4"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/SphynxMotionBlurToolkit/BaseClasses/shader_pass_resource.gd" id="1_rqnmr"]
|
||||
[ext_resource type="RDShaderFile" uid="uid://dyxn6g5gvoge7" path="res://addons/SphynxMotionBlurToolkit/Debug/ShaderFiles/debug_overlay.glsl" id="2_qgd1y"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_rqnmr")
|
||||
shader_file = ExtResource("2_qgd1y")
|
||||
@@ -0,0 +1,107 @@
|
||||
extends EnhancedCompositorEffect
|
||||
class_name DebugCompositorEffect
|
||||
|
||||
@export var overlay_stage : ShaderStageResource = preload("res://addons/SphynxMotionBlurToolkit/Debug/debug_overlay_shader_stage.tres"):
|
||||
set(value):
|
||||
unsubscribe_shader_stage(overlay_stage)
|
||||
overlay_stage = value
|
||||
subscirbe_shader_stage(value)
|
||||
|
||||
## wether to display debug views for velocity and depth
|
||||
## buffers
|
||||
@export var draw_debug : bool = false
|
||||
|
||||
## currently 0 - 1, flip between velocity buffers
|
||||
## and depth buffers debug views
|
||||
@export var debug_page : int = 0
|
||||
|
||||
@export var debug_1 : String = "debug_1"
|
||||
@export var debug_2 : String = "debug_2"
|
||||
@export var debug_3 : String = "debug_3"
|
||||
@export var debug_4 : String = "debug_4"
|
||||
@export var debug_5 : String = "debug_5"
|
||||
@export var debug_6 : String = "debug_6"
|
||||
@export var debug_7 : String = "debug_7"
|
||||
@export var debug_8 : String = "debug_8"
|
||||
|
||||
var past_color : StringName = "past_color"
|
||||
|
||||
var freeze : bool = false
|
||||
|
||||
func _init():
|
||||
set_deferred("context", "MotionBlur")
|
||||
super()
|
||||
|
||||
func _render_callback_2(render_size : Vector2i, render_scene_buffers : RenderSceneBuffersRD, render_scene_data : RenderSceneDataRD):
|
||||
ensure_texture(past_color, render_scene_buffers)
|
||||
ensure_texture(debug_1, render_scene_buffers)
|
||||
ensure_texture(debug_2, render_scene_buffers)
|
||||
ensure_texture(debug_3, render_scene_buffers)
|
||||
ensure_texture(debug_4, render_scene_buffers)
|
||||
ensure_texture(debug_5, render_scene_buffers)
|
||||
ensure_texture(debug_6, render_scene_buffers)
|
||||
ensure_texture(debug_7, render_scene_buffers)
|
||||
ensure_texture(debug_8, render_scene_buffers)
|
||||
|
||||
rd.draw_command_begin_label("Debug", Color(1.0, 1.0, 1.0, 1.0))
|
||||
|
||||
if Input.is_action_just_pressed("freeze"):
|
||||
freeze = !freeze
|
||||
|
||||
if Input.is_action_just_pressed("Z"):
|
||||
draw_debug = !draw_debug
|
||||
|
||||
if Input.is_action_just_pressed("C"):
|
||||
debug_page = 1 if debug_page == 0 else 0
|
||||
|
||||
var push_constant: PackedFloat32Array = [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
]
|
||||
var int_push_constant : PackedInt32Array = [
|
||||
freeze,
|
||||
draw_debug,
|
||||
debug_page,
|
||||
0
|
||||
]
|
||||
var byte_array = push_constant.to_byte_array()
|
||||
byte_array.append_array(int_push_constant.to_byte_array())
|
||||
|
||||
var view_count = render_scene_buffers.get_view_count()
|
||||
for view in range(view_count):
|
||||
var color_image := render_scene_buffers.get_color_layer(view)
|
||||
var past_color_image := render_scene_buffers.get_texture_slice(context, past_color, view, 0, 1, 1)
|
||||
var debug_1_image := render_scene_buffers.get_texture_slice(context, debug_1, view, 0, 1, 1)
|
||||
var debug_2_image := render_scene_buffers.get_texture_slice(context, debug_2, view, 0, 1, 1)
|
||||
var debug_3_image := render_scene_buffers.get_texture_slice(context, debug_3, view, 0, 1, 1)
|
||||
var debug_4_image := render_scene_buffers.get_texture_slice(context, debug_4, view, 0, 1, 1)
|
||||
var debug_5_image := render_scene_buffers.get_texture_slice(context, debug_5, view, 0, 1, 1)
|
||||
var debug_6_image := render_scene_buffers.get_texture_slice(context, debug_6, view, 0, 1, 1)
|
||||
var debug_7_image := render_scene_buffers.get_texture_slice(context, debug_7, view, 0, 1, 1)
|
||||
var debug_8_image := render_scene_buffers.get_texture_slice(context, debug_8, view, 0, 1, 1)
|
||||
|
||||
var x_groups := floori((render_size.x - 1) / 16 + 1)
|
||||
var y_groups := floori((render_size.y - 1) / 16 + 1)
|
||||
|
||||
dispatch_stage(overlay_stage,
|
||||
[
|
||||
get_image_uniform(past_color_image, 0),
|
||||
get_image_uniform(color_image, 1),
|
||||
get_sampler_uniform(color_image, 2),
|
||||
get_sampler_uniform(debug_1_image, 3),
|
||||
get_sampler_uniform(debug_2_image, 4),
|
||||
get_sampler_uniform(debug_3_image, 5),
|
||||
get_sampler_uniform(debug_4_image, 6),
|
||||
get_sampler_uniform(debug_5_image, 7),
|
||||
get_sampler_uniform(debug_6_image, 8),
|
||||
get_sampler_uniform(debug_7_image, 9),
|
||||
get_sampler_uniform(debug_8_image, 10),
|
||||
],
|
||||
byte_array,
|
||||
Vector3i(x_groups, y_groups, 1),
|
||||
"Debug Overlay",
|
||||
view)
|
||||
|
||||
rd.draw_command_end_label()
|
||||
Reference in New Issue
Block a user