mirror of
https://github.com/godotengine/godot.git
synced 2024-12-27 11:24:59 +08:00
75 lines
2.0 KiB
GLSL
75 lines
2.0 KiB
GLSL
/* 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
|
|
}
|