From 9b549231e4b4287ab9dcf1c1e6322314f3088e8c Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Fri, 23 Dec 2022 23:41:44 +1100 Subject: Move luminance effect into its own class and use new buffers system --- .../shaders/effects/luminance_reduce.glsl | 82 ++++++++++++++++++++++ .../shaders/effects/luminance_reduce_raster.glsl | 74 +++++++++++++++++++ .../effects/luminance_reduce_raster_inc.glsl | 11 +++ .../renderer_rd/shaders/luminance_reduce.glsl | 82 ---------------------- .../shaders/luminance_reduce_raster.glsl | 74 ------------------- .../shaders/luminance_reduce_raster_inc.glsl | 11 --- 6 files changed, 167 insertions(+), 167 deletions(-) create mode 100644 servers/rendering/renderer_rd/shaders/effects/luminance_reduce.glsl create mode 100644 servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster.glsl create mode 100644 servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster_inc.glsl delete mode 100644 servers/rendering/renderer_rd/shaders/luminance_reduce.glsl delete mode 100644 servers/rendering/renderer_rd/shaders/luminance_reduce_raster.glsl delete mode 100644 servers/rendering/renderer_rd/shaders/luminance_reduce_raster_inc.glsl (limited to 'servers/rendering/renderer_rd/shaders') diff --git a/servers/rendering/renderer_rd/shaders/effects/luminance_reduce.glsl b/servers/rendering/renderer_rd/shaders/effects/luminance_reduce.glsl new file mode 100644 index 0000000000..0ee4cf6e31 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/effects/luminance_reduce.glsl @@ -0,0 +1,82 @@ +#[compute] + +#version 450 + +#VERSION_DEFINES + +#define BLOCK_SIZE 8 + +layout(local_size_x = BLOCK_SIZE, local_size_y = BLOCK_SIZE, local_size_z = 1) in; + +shared float tmp_data[BLOCK_SIZE * BLOCK_SIZE]; + +#ifdef READ_TEXTURE + +//use for main texture +layout(set = 0, binding = 0) uniform sampler2D source_texture; + +#else + +//use for intermediate textures +layout(r32f, set = 0, binding = 0) uniform restrict readonly image2D source_luminance; + +#endif + +layout(r32f, set = 1, binding = 0) uniform restrict writeonly image2D dest_luminance; + +#ifdef WRITE_LUMINANCE +layout(set = 2, binding = 0) uniform sampler2D prev_luminance; +#endif + +layout(push_constant, std430) uniform Params { + ivec2 source_size; + float max_luminance; + float min_luminance; + float exposure_adjust; + float pad[3]; +} +params; + +void main() { + uint t = gl_LocalInvocationID.y * BLOCK_SIZE + gl_LocalInvocationID.x; + ivec2 pos = ivec2(gl_GlobalInvocationID.xy); + + if (any(lessThan(pos, params.source_size))) { +#ifdef READ_TEXTURE + vec3 v = texelFetch(source_texture, pos, 0).rgb; + tmp_data[t] = max(v.r, max(v.g, v.b)); +#else + tmp_data[t] = imageLoad(source_luminance, pos).r; +#endif + } else { + tmp_data[t] = 0.0; + } + + groupMemoryBarrier(); + barrier(); + + uint size = (BLOCK_SIZE * BLOCK_SIZE) >> 1; + + do { + if (t < size) { + tmp_data[t] += tmp_data[t + size]; + } + groupMemoryBarrier(); + barrier(); + + size >>= 1; + } while (size >= 1); + + if (t == 0) { + //compute rect size + ivec2 rect_size = min(params.source_size - pos, ivec2(BLOCK_SIZE)); + float avg = tmp_data[0] / float(rect_size.x * rect_size.y); + //float avg = tmp_data[0] / float(BLOCK_SIZE*BLOCK_SIZE); + pos /= ivec2(BLOCK_SIZE); +#ifdef WRITE_LUMINANCE + float prev_lum = texelFetch(prev_luminance, ivec2(0, 0), 0).r; //1 pixel previous exposure + avg = clamp(prev_lum + (avg - prev_lum) * params.exposure_adjust, params.min_luminance, params.max_luminance); +#endif + imageStore(dest_luminance, pos, vec4(avg)); + } +} diff --git a/servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster.glsl b/servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster.glsl new file mode 100644 index 0000000000..29ebd74a90 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster.glsl @@ -0,0 +1,74 @@ +/* clang-format off */ +#[vertex] + +#version 450 + +#VERSION_DEFINES + +#include "luminance_reduce_raster_inc.glsl" + +layout(location = 0) out vec2 uv_interp; +/* clang-format on */ + +void main() { + vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); + uv_interp = base_arr[gl_VertexIndex]; + + gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0); +} + +/* clang-format off */ +#[fragment] + +#version 450 + +#VERSION_DEFINES + +#include "luminance_reduce_raster_inc.glsl" + +layout(location = 0) in vec2 uv_interp; +/* clang-format on */ + +layout(set = 0, binding = 0) uniform sampler2D source_exposure; + +#ifdef FINAL_PASS +layout(set = 1, binding = 0) uniform sampler2D prev_luminance; +#endif + +layout(location = 0) out highp float luminance; + +void main() { + ivec2 dest_pos = ivec2(uv_interp * settings.dest_size); + ivec2 src_pos = ivec2(uv_interp * settings.source_size); + + ivec2 next_pos = (dest_pos + ivec2(1)) * settings.source_size / settings.dest_size; + next_pos = max(next_pos, src_pos + ivec2(1)); //so it at least reads one pixel + + highp vec3 source_color = vec3(0.0); + for (int i = src_pos.x; i < next_pos.x; i++) { + for (int j = src_pos.y; j < next_pos.y; j++) { + source_color += texelFetch(source_exposure, ivec2(i, j), 0).rgb; + } + } + + source_color /= float((next_pos.x - src_pos.x) * (next_pos.y - src_pos.y)); + +#ifdef FIRST_PASS + luminance = max(source_color.r, max(source_color.g, source_color.b)); + + // This formula should be more "accurate" but gave an overexposed result when testing. + // Leaving it here so we can revisit it if we want. + // luminance = source_color.r * 0.21 + source_color.g * 0.71 + source_color.b * 0.07; +#else + luminance = source_color.r; +#endif + +#ifdef FINAL_PASS + // Obtain our target luminance + luminance = clamp(luminance, settings.min_luminance, settings.max_luminance); + + // Now smooth to our transition + highp float prev_lum = texelFetch(prev_luminance, ivec2(0, 0), 0).r; //1 pixel previous luminance + luminance = prev_lum + (luminance - prev_lum) * clamp(settings.exposure_adjust, 0.0, 1.0); +#endif +} diff --git a/servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster_inc.glsl b/servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster_inc.glsl new file mode 100644 index 0000000000..b8860f6518 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/effects/luminance_reduce_raster_inc.glsl @@ -0,0 +1,11 @@ + +layout(push_constant, std430) uniform PushConstant { + ivec2 source_size; + ivec2 dest_size; + + float exposure_adjust; + float min_luminance; + float max_luminance; + uint pad1; +} +settings; diff --git a/servers/rendering/renderer_rd/shaders/luminance_reduce.glsl b/servers/rendering/renderer_rd/shaders/luminance_reduce.glsl deleted file mode 100644 index 0ee4cf6e31..0000000000 --- a/servers/rendering/renderer_rd/shaders/luminance_reduce.glsl +++ /dev/null @@ -1,82 +0,0 @@ -#[compute] - -#version 450 - -#VERSION_DEFINES - -#define BLOCK_SIZE 8 - -layout(local_size_x = BLOCK_SIZE, local_size_y = BLOCK_SIZE, local_size_z = 1) in; - -shared float tmp_data[BLOCK_SIZE * BLOCK_SIZE]; - -#ifdef READ_TEXTURE - -//use for main texture -layout(set = 0, binding = 0) uniform sampler2D source_texture; - -#else - -//use for intermediate textures -layout(r32f, set = 0, binding = 0) uniform restrict readonly image2D source_luminance; - -#endif - -layout(r32f, set = 1, binding = 0) uniform restrict writeonly image2D dest_luminance; - -#ifdef WRITE_LUMINANCE -layout(set = 2, binding = 0) uniform sampler2D prev_luminance; -#endif - -layout(push_constant, std430) uniform Params { - ivec2 source_size; - float max_luminance; - float min_luminance; - float exposure_adjust; - float pad[3]; -} -params; - -void main() { - uint t = gl_LocalInvocationID.y * BLOCK_SIZE + gl_LocalInvocationID.x; - ivec2 pos = ivec2(gl_GlobalInvocationID.xy); - - if (any(lessThan(pos, params.source_size))) { -#ifdef READ_TEXTURE - vec3 v = texelFetch(source_texture, pos, 0).rgb; - tmp_data[t] = max(v.r, max(v.g, v.b)); -#else - tmp_data[t] = imageLoad(source_luminance, pos).r; -#endif - } else { - tmp_data[t] = 0.0; - } - - groupMemoryBarrier(); - barrier(); - - uint size = (BLOCK_SIZE * BLOCK_SIZE) >> 1; - - do { - if (t < size) { - tmp_data[t] += tmp_data[t + size]; - } - groupMemoryBarrier(); - barrier(); - - size >>= 1; - } while (size >= 1); - - if (t == 0) { - //compute rect size - ivec2 rect_size = min(params.source_size - pos, ivec2(BLOCK_SIZE)); - float avg = tmp_data[0] / float(rect_size.x * rect_size.y); - //float avg = tmp_data[0] / float(BLOCK_SIZE*BLOCK_SIZE); - pos /= ivec2(BLOCK_SIZE); -#ifdef WRITE_LUMINANCE - float prev_lum = texelFetch(prev_luminance, ivec2(0, 0), 0).r; //1 pixel previous exposure - avg = clamp(prev_lum + (avg - prev_lum) * params.exposure_adjust, params.min_luminance, params.max_luminance); -#endif - imageStore(dest_luminance, pos, vec4(avg)); - } -} diff --git a/servers/rendering/renderer_rd/shaders/luminance_reduce_raster.glsl b/servers/rendering/renderer_rd/shaders/luminance_reduce_raster.glsl deleted file mode 100644 index 29ebd74a90..0000000000 --- a/servers/rendering/renderer_rd/shaders/luminance_reduce_raster.glsl +++ /dev/null @@ -1,74 +0,0 @@ -/* clang-format off */ -#[vertex] - -#version 450 - -#VERSION_DEFINES - -#include "luminance_reduce_raster_inc.glsl" - -layout(location = 0) out vec2 uv_interp; -/* clang-format on */ - -void main() { - vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); - uv_interp = base_arr[gl_VertexIndex]; - - gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0); -} - -/* clang-format off */ -#[fragment] - -#version 450 - -#VERSION_DEFINES - -#include "luminance_reduce_raster_inc.glsl" - -layout(location = 0) in vec2 uv_interp; -/* clang-format on */ - -layout(set = 0, binding = 0) uniform sampler2D source_exposure; - -#ifdef FINAL_PASS -layout(set = 1, binding = 0) uniform sampler2D prev_luminance; -#endif - -layout(location = 0) out highp float luminance; - -void main() { - ivec2 dest_pos = ivec2(uv_interp * settings.dest_size); - ivec2 src_pos = ivec2(uv_interp * settings.source_size); - - ivec2 next_pos = (dest_pos + ivec2(1)) * settings.source_size / settings.dest_size; - next_pos = max(next_pos, src_pos + ivec2(1)); //so it at least reads one pixel - - highp vec3 source_color = vec3(0.0); - for (int i = src_pos.x; i < next_pos.x; i++) { - for (int j = src_pos.y; j < next_pos.y; j++) { - source_color += texelFetch(source_exposure, ivec2(i, j), 0).rgb; - } - } - - source_color /= float((next_pos.x - src_pos.x) * (next_pos.y - src_pos.y)); - -#ifdef FIRST_PASS - luminance = max(source_color.r, max(source_color.g, source_color.b)); - - // This formula should be more "accurate" but gave an overexposed result when testing. - // Leaving it here so we can revisit it if we want. - // luminance = source_color.r * 0.21 + source_color.g * 0.71 + source_color.b * 0.07; -#else - luminance = source_color.r; -#endif - -#ifdef FINAL_PASS - // Obtain our target luminance - luminance = clamp(luminance, settings.min_luminance, settings.max_luminance); - - // Now smooth to our transition - highp float prev_lum = texelFetch(prev_luminance, ivec2(0, 0), 0).r; //1 pixel previous luminance - luminance = prev_lum + (luminance - prev_lum) * clamp(settings.exposure_adjust, 0.0, 1.0); -#endif -} diff --git a/servers/rendering/renderer_rd/shaders/luminance_reduce_raster_inc.glsl b/servers/rendering/renderer_rd/shaders/luminance_reduce_raster_inc.glsl deleted file mode 100644 index b8860f6518..0000000000 --- a/servers/rendering/renderer_rd/shaders/luminance_reduce_raster_inc.glsl +++ /dev/null @@ -1,11 +0,0 @@ - -layout(push_constant, std430) uniform PushConstant { - ivec2 source_size; - ivec2 dest_size; - - float exposure_adjust; - float min_luminance; - float max_luminance; - uint pad1; -} -settings; -- cgit v1.2.3