From bed8980ca50cb6a197f37e3decaff963d5cedce1 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sat, 25 Jan 2020 07:18:55 -0300 Subject: Re-implemented screen space ambient occlusion --- .../visual/rasterizer_rd/shaders/ssao_minify.glsl | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 servers/visual/rasterizer_rd/shaders/ssao_minify.glsl (limited to 'servers/visual/rasterizer_rd/shaders/ssao_minify.glsl') diff --git a/servers/visual/rasterizer_rd/shaders/ssao_minify.glsl b/servers/visual/rasterizer_rd/shaders/ssao_minify.glsl new file mode 100644 index 0000000000..0e6f8b7d9a --- /dev/null +++ b/servers/visual/rasterizer_rd/shaders/ssao_minify.glsl @@ -0,0 +1,49 @@ +/* clang-format off */ +[compute] +/* clang-format on */ + +#version 450 + +VERSION_DEFINES + +layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(push_constant, binding = 1, std430) uniform Params { + vec2 pixel_size; + float z_far; + float z_near; + ivec2 source_size; + bool orthogonal; + uint pad; +} params; + + +#ifdef MINIFY_START +layout(set = 0, binding = 0) uniform sampler2D source_texture; +#else +layout(r32f, set = 0, binding = 0) uniform restrict readonly image2D source_image; +#endif +layout(r32f, set = 1, binding = 0) uniform restrict writeonly image2D dest_image; + +void main() { + + ivec2 pos = ivec2(gl_GlobalInvocationID.xy); + + if (any(greaterThan(pos,params.source_size>>1))) { //too large, do nothing + return; + } + +#ifdef MINIFY_START + float depth = texelFetch(source_texture,pos<<1,0).r * 2.0 - 1.0; + if (params.orthogonal) { + depth = ((depth + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0; + } else { + depth = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - depth * (params.z_far - params.z_near)); + } +#else + float depth = imageLoad(source_image,pos<<1).r; +#endif + + imageStore(dest_image,pos,vec4(depth)); + +} -- cgit v1.2.3