summaryrefslogtreecommitdiff
path: root/servers/visual/rasterizer_rd/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'servers/visual/rasterizer_rd/shaders')
-rw-r--r--servers/visual/rasterizer_rd/shaders/SCsub24
-rw-r--r--servers/visual/rasterizer_rd/shaders/blur.glsl294
-rw-r--r--servers/visual/rasterizer_rd/shaders/blur_inc.glsl35
-rw-r--r--servers/visual/rasterizer_rd/shaders/bokeh_dof.glsl258
-rw-r--r--servers/visual/rasterizer_rd/shaders/canvas.glsl584
-rw-r--r--servers/visual/rasterizer_rd/shaders/canvas_occlusion.glsl40
-rw-r--r--servers/visual/rasterizer_rd/shaders/canvas_uniforms_inc.glsl141
-rw-r--r--servers/visual/rasterizer_rd/shaders/copy.glsl86
-rw-r--r--servers/visual/rasterizer_rd/shaders/cubemap_downsampler.glsl220
-rw-r--r--servers/visual/rasterizer_rd/shaders/cubemap_filter.glsl289
-rw-r--r--servers/visual/rasterizer_rd/shaders/cubemap_roughness.glsl184
-rw-r--r--servers/visual/rasterizer_rd/shaders/giprobe.glsl788
-rw-r--r--servers/visual/rasterizer_rd/shaders/giprobe_debug.glsl208
-rw-r--r--servers/visual/rasterizer_rd/shaders/giprobe_sdf.glsl187
-rw-r--r--servers/visual/rasterizer_rd/shaders/giprobe_write.glsl335
-rw-r--r--servers/visual/rasterizer_rd/shaders/luminance_reduce.glsl87
-rw-r--r--servers/visual/rasterizer_rd/shaders/roughness_limiter.glsl73
-rw-r--r--servers/visual/rasterizer_rd/shaders/scene_high_end.glsl1718
-rw-r--r--servers/visual/rasterizer_rd/shaders/scene_high_end_inc.glsl266
-rw-r--r--servers/visual/rasterizer_rd/shaders/sky.glsl79
-rw-r--r--servers/visual/rasterizer_rd/shaders/ssao.glsl252
-rw-r--r--servers/visual/rasterizer_rd/shaders/ssao_blur.glsl157
-rw-r--r--servers/visual/rasterizer_rd/shaders/ssao_minify.glsl48
-rw-r--r--servers/visual/rasterizer_rd/shaders/tonemap.glsl305
24 files changed, 0 insertions, 6658 deletions
diff --git a/servers/visual/rasterizer_rd/shaders/SCsub b/servers/visual/rasterizer_rd/shaders/SCsub
deleted file mode 100644
index 2dcb2a703f..0000000000
--- a/servers/visual/rasterizer_rd/shaders/SCsub
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-
-Import('env')
-
-if 'RD_GLSL' in env['BUILDERS']:
- env.RD_GLSL('canvas.glsl');
- env.RD_GLSL('canvas_occlusion.glsl');
- env.RD_GLSL('blur.glsl');
- env.RD_GLSL('cubemap_roughness.glsl');
- env.RD_GLSL('cubemap_downsampler.glsl');
- env.RD_GLSL('cubemap_filter.glsl');
- env.RD_GLSL('scene_high_end.glsl');
- env.RD_GLSL('sky.glsl');
- env.RD_GLSL('tonemap.glsl');
- env.RD_GLSL('copy.glsl');
- env.RD_GLSL('giprobe.glsl');
- env.RD_GLSL('giprobe_debug.glsl');
- env.RD_GLSL('giprobe_sdf.glsl');
- env.RD_GLSL('luminance_reduce.glsl');
- env.RD_GLSL('bokeh_dof.glsl');
- env.RD_GLSL('ssao.glsl');
- env.RD_GLSL('ssao_minify.glsl');
- env.RD_GLSL('ssao_blur.glsl');
- env.RD_GLSL('roughness_limiter.glsl');
diff --git a/servers/visual/rasterizer_rd/shaders/blur.glsl b/servers/visual/rasterizer_rd/shaders/blur.glsl
deleted file mode 100644
index 87c20ebaef..0000000000
--- a/servers/visual/rasterizer_rd/shaders/blur.glsl
+++ /dev/null
@@ -1,294 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-#include "blur_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];
-
- if (bool(blur.flags & FLAG_USE_BLUR_SECTION)) {
- uv_interp = blur.section.xy + uv_interp * blur.section.zw;
- }
-
- gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0);
-
- if (bool(blur.flags & FLAG_FLIP_Y)) {
- uv_interp.y = 1.0 - uv_interp.y;
- }
-}
-
-/* clang-format off */
-[fragment]
-
-#version 450
-
-VERSION_DEFINES
-
-#include "blur_inc.glsl"
-
-layout(location = 0) in vec2 uv_interp;
-/* clang-format on */
-
-layout(set = 0, binding = 0) uniform sampler2D source_color;
-
-#ifdef MODE_SSAO_MERGE
-layout(set = 1, binding = 0) uniform sampler2D source_ssao;
-#endif
-
-#ifdef GLOW_USE_AUTO_EXPOSURE
-layout(set = 1, binding = 0) uniform sampler2D source_auto_exposure;
-#endif
-
-layout(location = 0) out vec4 frag_color;
-
-//DOF
-#if defined(MODE_DOF_FAR_BLUR) || defined(MODE_DOF_NEAR_BLUR)
-
-layout(set = 1, binding = 0) uniform sampler2D dof_source_depth;
-
-#ifdef DOF_NEAR_BLUR_MERGE
-layout(set = 2, binding = 0) uniform sampler2D source_dof_original;
-#endif
-
-#ifdef DOF_QUALITY_LOW
-const int dof_kernel_size = 5;
-const int dof_kernel_from = 2;
-const float dof_kernel[5] = float[](0.153388, 0.221461, 0.250301, 0.221461, 0.153388);
-#endif
-
-#ifdef DOF_QUALITY_MEDIUM
-const int dof_kernel_size = 11;
-const int dof_kernel_from = 5;
-const float dof_kernel[11] = float[](0.055037, 0.072806, 0.090506, 0.105726, 0.116061, 0.119726, 0.116061, 0.105726, 0.090506, 0.072806, 0.055037);
-
-#endif
-
-#ifdef DOF_QUALITY_HIGH
-const int dof_kernel_size = 21;
-const int dof_kernel_from = 10;
-const float dof_kernel[21] = float[](0.028174, 0.032676, 0.037311, 0.041944, 0.046421, 0.050582, 0.054261, 0.057307, 0.059587, 0.060998, 0.061476, 0.060998, 0.059587, 0.057307, 0.054261, 0.050582, 0.046421, 0.041944, 0.037311, 0.032676, 0.028174);
-#endif
-
-#endif
-
-void main() {
-
-#ifdef MODE_MIPMAP
-
- vec2 pix_size = blur.pixel_size;
- vec4 color = texture(source_color, uv_interp + vec2(-0.5, -0.5) * pix_size);
- color += texture(source_color, uv_interp + vec2(0.5, -0.5) * pix_size);
- color += texture(source_color, uv_interp + vec2(0.5, 0.5) * pix_size);
- color += texture(source_color, uv_interp + vec2(-0.5, 0.5) * pix_size);
- frag_color = color / 4.0;
-
-#endif
-
-#ifdef MODE_GAUSSIAN_BLUR
-
- //Simpler blur uses SIGMA2 for the gaussian kernel for a stronger effect
-
- if (bool(blur.flags & FLAG_HORIZONTAL)) {
-
- vec2 pix_size = blur.pixel_size;
- pix_size *= 0.5; //reading from larger buffer, so use more samples
- vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.214607;
- color += texture(source_color, uv_interp + vec2(1.0, 0.0) * pix_size) * 0.189879;
- color += texture(source_color, uv_interp + vec2(2.0, 0.0) * pix_size) * 0.131514;
- color += texture(source_color, uv_interp + vec2(3.0, 0.0) * pix_size) * 0.071303;
- color += texture(source_color, uv_interp + vec2(-1.0, 0.0) * pix_size) * 0.189879;
- color += texture(source_color, uv_interp + vec2(-2.0, 0.0) * pix_size) * 0.131514;
- color += texture(source_color, uv_interp + vec2(-3.0, 0.0) * pix_size) * 0.071303;
- frag_color = color;
- } else {
-
- vec2 pix_size = blur.pixel_size;
- vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.38774;
- color += texture(source_color, uv_interp + vec2(0.0, 1.0) * pix_size) * 0.24477;
- color += texture(source_color, uv_interp + vec2(0.0, 2.0) * pix_size) * 0.06136;
- color += texture(source_color, uv_interp + vec2(0.0, -1.0) * pix_size) * 0.24477;
- color += texture(source_color, uv_interp + vec2(0.0, -2.0) * pix_size) * 0.06136;
- frag_color = color;
- }
-#endif
-
-#ifdef MODE_GAUSSIAN_GLOW
-
- //Glow uses larger sigma 1 for a more rounded blur effect
-
-#define GLOW_ADD(m_ofs, m_mult) \
- { \
- vec2 ofs = uv_interp + m_ofs * pix_size; \
- vec4 c = texture(source_color, ofs) * m_mult; \
- if (any(lessThan(ofs, vec2(0.0))) || any(greaterThan(ofs, vec2(1.0)))) { \
- c *= 0.0; \
- } \
- color += c; \
- }
-
- if (bool(blur.flags & FLAG_HORIZONTAL)) {
-
- vec2 pix_size = blur.pixel_size;
- pix_size *= 0.5; //reading from larger buffer, so use more samples
- vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.174938;
- GLOW_ADD(vec2(1.0, 0.0), 0.165569);
- GLOW_ADD(vec2(2.0, 0.0), 0.140367);
- GLOW_ADD(vec2(3.0, 0.0), 0.106595);
- GLOW_ADD(vec2(-1.0, 0.0), 0.165569);
- GLOW_ADD(vec2(-2.0, 0.0), 0.140367);
- GLOW_ADD(vec2(-3.0, 0.0), 0.106595);
- color *= blur.glow_strength;
- frag_color = color;
- } else {
-
- vec2 pix_size = blur.pixel_size;
- vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.288713;
- GLOW_ADD(vec2(0.0, 1.0), 0.233062);
- GLOW_ADD(vec2(0.0, 2.0), 0.122581);
- GLOW_ADD(vec2(0.0, -1.0), 0.233062);
- GLOW_ADD(vec2(0.0, -2.0), 0.122581);
- color *= blur.glow_strength;
- frag_color = color;
- }
-
-#undef GLOW_ADD
-
- if (bool(blur.flags & FLAG_GLOW_FIRST_PASS)) {
-#ifdef GLOW_USE_AUTO_EXPOSURE
-
- frag_color /= texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / blur.glow_auto_exposure_grey;
-#endif
- frag_color *= blur.glow_exposure;
-
- float luminance = max(frag_color.r, max(frag_color.g, frag_color.b));
- float feedback = max(smoothstep(blur.glow_hdr_threshold, blur.glow_hdr_threshold + blur.glow_hdr_scale, luminance), blur.glow_bloom);
-
- frag_color = min(frag_color * feedback, vec4(blur.glow_luminance_cap));
- }
-
-#endif
-
-#ifdef MODE_DOF_FAR_BLUR
-
- vec4 color_accum = vec4(0.0);
-
- float depth = texture(dof_source_depth, uv_interp, 0.0).r;
- depth = depth * 2.0 - 1.0;
-
- if (bool(blur.flags & FLAG_USE_ORTHOGONAL_PROJECTION)) {
- depth = ((depth + (blur.camera_z_far + blur.camera_z_near) / (blur.camera_z_far - blur.camera_z_near)) * (blur.camera_z_far - blur.camera_z_near)) / 2.0;
- } else {
- depth = 2.0 * blur.camera_z_near * blur.camera_z_far / (blur.camera_z_far + blur.camera_z_near - depth * (blur.camera_z_far - blur.camera_z_near));
- }
-
- float amount = smoothstep(blur.dof_begin, blur.dof_end, depth);
- float k_accum = 0.0;
-
- for (int i = 0; i < dof_kernel_size; i++) {
-
- int int_ofs = i - dof_kernel_from;
- vec2 tap_uv = uv_interp + blur.dof_dir * float(int_ofs) * amount * blur.dof_radius;
-
- float tap_k = dof_kernel[i];
-
- float tap_depth = texture(dof_source_depth, tap_uv, 0.0).r;
- tap_depth = tap_depth * 2.0 - 1.0;
-
- if (bool(blur.flags & FLAG_USE_ORTHOGONAL_PROJECTION)) {
-
- tap_depth = ((tap_depth + (blur.camera_z_far + blur.camera_z_near) / (blur.camera_z_far - blur.camera_z_near)) * (blur.camera_z_far - blur.camera_z_near)) / 2.0;
- } else {
- tap_depth = 2.0 * blur.camera_z_near * blur.camera_z_far / (blur.camera_z_far + blur.camera_z_near - tap_depth * (blur.camera_z_far - blur.camera_z_near));
- }
-
- float tap_amount = mix(smoothstep(blur.dof_begin, blur.dof_end, tap_depth), 1.0, int_ofs == 0);
- tap_amount *= tap_amount * tap_amount; //prevent undesired glow effect
-
- vec4 tap_color = texture(source_color, tap_uv, 0.0) * tap_k;
-
- k_accum += tap_k * tap_amount;
- color_accum += tap_color * tap_amount;
- }
-
- if (k_accum > 0.0) {
- color_accum /= k_accum;
- }
-
- frag_color = color_accum; ///k_accum;
-
-#endif
-
-#ifdef MODE_DOF_NEAR_BLUR
-
- vec4 color_accum = vec4(0.0);
-
- float max_accum = 0.0;
-
- for (int i = 0; i < dof_kernel_size; i++) {
-
- int int_ofs = i - dof_kernel_from;
- vec2 tap_uv = uv_interp + blur.dof_dir * float(int_ofs) * blur.dof_radius;
- float ofs_influence = max(0.0, 1.0 - float(abs(int_ofs)) / float(dof_kernel_from));
-
- float tap_k = dof_kernel[i];
-
- vec4 tap_color = texture(source_color, tap_uv, 0.0);
-
- float tap_depth = texture(dof_source_depth, tap_uv, 0.0).r;
- tap_depth = tap_depth * 2.0 - 1.0;
- if (bool(blur.flags & FLAG_USE_ORTHOGONAL_PROJECTION)) {
-
- tap_depth = ((tap_depth + (blur.camera_z_far + blur.camera_z_near) / (blur.camera_z_far - blur.camera_z_near)) * (blur.camera_z_far - blur.camera_z_near)) / 2.0;
- } else {
- tap_depth = 2.0 * blur.camera_z_near * blur.camera_z_far / (blur.camera_z_far + blur.camera_z_near - tap_depth * (blur.camera_z_far - blur.camera_z_near));
- }
- float tap_amount = 1.0 - smoothstep(blur.dof_end, blur.dof_begin, tap_depth);
- tap_amount *= tap_amount * tap_amount; //prevent undesired glow effect
-
- if (bool(blur.flags & FLAG_DOF_NEAR_FIRST_TAP)) {
- tap_color.a = 1.0 - smoothstep(blur.dof_end, blur.dof_begin, tap_depth);
- }
-
- max_accum = max(max_accum, tap_amount * ofs_influence);
-
- color_accum += tap_color * tap_k;
- }
-
- color_accum.a = max(color_accum.a, sqrt(max_accum));
-
-#ifdef DOF_NEAR_BLUR_MERGE
- {
- vec4 original = texture(source_dof_original, uv_interp, 0.0);
- color_accum = mix(original, color_accum, color_accum.a);
- }
-#endif
-
- if (bool(blur.flags & FLAG_DOF_NEAR_FIRST_TAP)) {
- frag_color = color_accum;
- }
-#endif
-
-#ifdef MODE_SIMPLE_COPY
- vec4 color = texture(source_color, uv_interp, 0.0);
- if (bool(blur.flags & FLAG_COPY_FORCE_LUMINANCE)) {
- color.rgb = vec3(max(max(color.r, color.g), color.b));
- }
- frag_color = color;
-#endif
-
-#ifdef MODE_SSAO_MERGE
- vec4 color = texture(source_color, uv_interp, 0.0);
- float ssao = texture(source_ssao, uv_interp, 0.0).r;
- frag_color = vec4(mix(color.rgb, color.rgb * mix(blur.ssao_color.rgb, vec3(1.0), ssao), color.a), 1.0);
-
-#endif
-}
diff --git a/servers/visual/rasterizer_rd/shaders/blur_inc.glsl b/servers/visual/rasterizer_rd/shaders/blur_inc.glsl
deleted file mode 100644
index 33ba9de7bb..0000000000
--- a/servers/visual/rasterizer_rd/shaders/blur_inc.glsl
+++ /dev/null
@@ -1,35 +0,0 @@
-#define FLAG_HORIZONTAL (1 << 0)
-#define FLAG_USE_BLUR_SECTION (1 << 1)
-#define FLAG_USE_ORTHOGONAL_PROJECTION (1 << 2)
-#define FLAG_DOF_NEAR_FIRST_TAP (1 << 3)
-#define FLAG_GLOW_FIRST_PASS (1 << 4)
-#define FLAG_FLIP_Y (1 << 5)
-#define FLAG_COPY_FORCE_LUMINANCE (1 << 6)
-
-layout(push_constant, binding = 1, std430) uniform Blur {
- vec4 section;
- vec2 pixel_size;
- uint flags;
- uint pad;
- // Glow.
- float glow_strength;
- float glow_bloom;
- float glow_hdr_threshold;
- float glow_hdr_scale;
- float glow_exposure;
- float glow_white;
- float glow_luminance_cap;
- float glow_auto_exposure_grey;
- // DOF.
- float dof_begin;
- float dof_end;
- float dof_radius;
- float dof_pad;
-
- vec2 dof_dir;
- float camera_z_far;
- float camera_z_near;
-
- vec4 ssao_color;
-}
-blur;
diff --git a/servers/visual/rasterizer_rd/shaders/bokeh_dof.glsl b/servers/visual/rasterizer_rd/shaders/bokeh_dof.glsl
deleted file mode 100644
index 7153fe6b17..0000000000
--- a/servers/visual/rasterizer_rd/shaders/bokeh_dof.glsl
+++ /dev/null
@@ -1,258 +0,0 @@
-/* clang-format off */
-[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;
-/* clang-format on */
-
-#ifdef MODE_GEN_BLUR_SIZE
-layout(rgba16f, set = 0, binding = 0) uniform restrict image2D color_image;
-layout(set = 1, binding = 0) uniform sampler2D source_depth;
-#endif
-
-#if defined(MODE_BOKEH_BOX) || defined(MODE_BOKEH_HEXAGONAL) || defined(MODE_BOKEH_CIRCULAR)
-layout(set = 1, binding = 0) uniform sampler2D color_texture;
-layout(rgba16f, set = 0, binding = 0) uniform restrict writeonly image2D bokeh_image;
-#endif
-
-#ifdef MODE_COMPOSITE_BOKEH
-layout(rgba16f, set = 0, binding = 0) uniform restrict image2D color_image;
-layout(set = 1, binding = 0) uniform sampler2D source_bokeh;
-#endif
-
-// based on https://www.shadertoy.com/view/Xd3GDl
-
-layout(push_constant, binding = 1, std430) uniform Params {
- ivec2 size;
- float z_far;
- float z_near;
-
- bool orthogonal;
- float blur_size;
- float blur_scale;
- int blur_steps;
-
- bool blur_near_active;
- float blur_near_begin;
- float blur_near_end;
- bool blur_far_active;
-
- float blur_far_begin;
- float blur_far_end;
- bool second_pass;
- bool half_size;
-
- bool use_jitter;
- float jitter_seed;
- uint pad[2];
-}
-params;
-
-//used to work around downsampling filter
-#define DEPTH_GAP 0.0
-
-#ifdef MODE_GEN_BLUR_SIZE
-
-float get_depth_at_pos(vec2 uv) {
- float depth = textureLod(source_depth, uv, 0.0).x;
- 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));
- }
- return depth;
-}
-
-float get_blur_size(float depth) {
-
- if (params.blur_near_active && depth < params.blur_near_begin) {
- return -(1.0 - smoothstep(params.blur_near_end, params.blur_near_begin, depth)) * params.blur_size - DEPTH_GAP; //near blur is negative
- }
-
- if (params.blur_far_active && depth > params.blur_far_begin) {
- return smoothstep(params.blur_far_begin, params.blur_far_end, depth) * params.blur_size + DEPTH_GAP;
- }
-
- return 0.0;
-}
-
-#endif
-
-const float GOLDEN_ANGLE = 2.39996323;
-
-//note: uniform pdf rand [0;1[
-float hash12n(vec2 p) {
- p = fract(p * vec2(5.3987, 5.4421));
- p += dot(p.yx, p.xy + vec2(21.5351, 14.3137));
- return fract(p.x * p.y * 95.4307);
-}
-
-#if defined(MODE_BOKEH_BOX) || defined(MODE_BOKEH_HEXAGONAL)
-
-vec4 weighted_filter_dir(vec2 dir, vec2 uv, vec2 pixel_size) {
-
- dir *= pixel_size;
- vec4 color = texture(color_texture, uv);
-
- vec4 accum = color;
- float total = 1.0;
-
- float blur_scale = params.blur_size / float(params.blur_steps);
-
- if (params.use_jitter) {
- uv += dir * (hash12n(uv + params.jitter_seed) - 0.5);
- }
-
- for (int i = -params.blur_steps; i <= params.blur_steps; i++) {
-
- if (i == 0) {
- continue;
- }
- float radius = float(i) * blur_scale;
- vec2 suv = uv + dir * radius;
- radius = abs(radius);
-
- vec4 sample_color = texture(color_texture, suv);
- float limit;
-
- if (sample_color.a < color.a) {
- limit = abs(sample_color.a);
- } else {
- limit = abs(color.a);
- }
-
- limit -= DEPTH_GAP;
-
- float m = smoothstep(radius - 0.5, radius + 0.5, limit);
-
- accum += mix(color, sample_color, m);
-
- total += 1.0;
- }
-
- return accum / total;
-}
-
-#endif
-
-void main() {
-
- ivec2 pos = ivec2(gl_GlobalInvocationID.xy);
-
- if (any(greaterThan(pos, params.size))) { //too large, do nothing
- return;
- }
-
- vec2 pixel_size = 1.0 / vec2(params.size);
- vec2 uv = vec2(pos) / vec2(params.size);
-
-#ifdef MODE_GEN_BLUR_SIZE
- uv += pixel_size * 0.5;
- //precompute size in alpha channel
- float depth = get_depth_at_pos(uv);
- float size = get_blur_size(depth);
-
- vec4 color = imageLoad(color_image, pos);
- color.a = size;
- imageStore(color_image, pos, color);
-#endif
-
-#ifdef MODE_BOKEH_BOX
-
- //pixel_size*=0.5; //resolution is doubled
- if (params.second_pass || !params.half_size) {
- uv += pixel_size * 0.5; //half pixel to read centers
- } else {
- uv += pixel_size * 0.25; //half pixel to read centers from full res
- }
-
- vec2 dir = (params.second_pass ? vec2(0.0, 1.0) : vec2(1.0, 0.0));
-
- vec4 color = weighted_filter_dir(dir, uv, pixel_size);
-
- imageStore(bokeh_image, pos, color);
-
-#endif
-
-#ifdef MODE_BOKEH_HEXAGONAL
-
- //pixel_size*=0.5; //resolution is doubled
- if (params.second_pass || !params.half_size) {
- uv += pixel_size * 0.5; //half pixel to read centers
- } else {
- uv += pixel_size * 0.25; //half pixel to read centers from full res
- }
-
- vec2 dir = (params.second_pass ? normalize(vec2(1.0, 0.577350269189626)) : vec2(0.0, 1.0));
-
- vec4 color = weighted_filter_dir(dir, uv, pixel_size);
-
- if (params.second_pass) {
- dir = normalize(vec2(-1.0, 0.577350269189626));
-
- vec4 color2 = weighted_filter_dir(dir, uv, pixel_size);
-
- color.rgb = min(color.rgb, color2.rgb);
- color.a = (color.a + color2.a) * 0.5;
- }
-
- imageStore(bokeh_image, pos, color);
-
-#endif
-
-#ifdef MODE_BOKEH_CIRCULAR
-
- if (params.half_size) {
- pixel_size *= 0.5; //resolution is doubled
- }
-
- uv += pixel_size * 0.5; //half pixel to read centers
-
- vec4 color = texture(color_texture, uv);
- float accum = 1.0;
- float radius = params.blur_scale;
-
- for (float ang = 0.0; radius < params.blur_size; ang += GOLDEN_ANGLE) {
-
- vec2 suv = uv + vec2(cos(ang), sin(ang)) * pixel_size * radius;
- vec4 sample_color = texture(color_texture, suv);
- float sample_size = abs(sample_color.a);
- if (sample_color.a > color.a) {
- sample_size = clamp(sample_size, 0.0, abs(color.a) * 2.0);
- }
-
- float m = smoothstep(radius - 0.5, radius + 0.5, sample_size);
- color += mix(color / accum, sample_color, m);
- accum += 1.0;
- radius += params.blur_scale / radius;
- }
-
- color /= accum;
-
- imageStore(bokeh_image, pos, color);
-#endif
-
-#ifdef MODE_COMPOSITE_BOKEH
-
- uv += pixel_size * 0.5;
- vec4 color = imageLoad(color_image, pos);
- vec4 bokeh = texture(source_bokeh, uv);
-
- float mix_amount;
- if (bokeh.a < color.a) {
- mix_amount = min(1.0, max(0.0, max(abs(color.a), abs(bokeh.a)) - DEPTH_GAP));
- } else {
- mix_amount = min(1.0, max(0.0, abs(color.a) - DEPTH_GAP));
- }
-
- color.rgb = mix(color.rgb, bokeh.rgb, mix_amount); //blend between hires and lowres
-
- color.a = 0; //reset alpha
- imageStore(color_image, pos, color);
-#endif
-}
diff --git a/servers/visual/rasterizer_rd/shaders/canvas.glsl b/servers/visual/rasterizer_rd/shaders/canvas.glsl
deleted file mode 100644
index 28135fce31..0000000000
--- a/servers/visual/rasterizer_rd/shaders/canvas.glsl
+++ /dev/null
@@ -1,584 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-#ifdef USE_ATTRIBUTES
-layout(location = 0) in vec2 vertex_attrib;
-/* clang-format on */
-layout(location = 3) in vec4 color_attrib;
-layout(location = 4) in vec2 uv_attrib;
-
-layout(location = 6) in uvec4 bones_attrib;
-
-#endif
-
-#include "canvas_uniforms_inc.glsl"
-
-layout(location = 0) out vec2 uv_interp;
-layout(location = 1) out vec4 color_interp;
-layout(location = 2) out vec2 vertex_interp;
-
-#ifdef USE_NINEPATCH
-
-layout(location = 3) out vec2 pixel_size_interp;
-
-#endif
-
-#ifdef USE_MATERIAL_UNIFORMS
-layout(set = 1, binding = 1, std140) uniform MaterialUniforms{
- /* clang-format off */
-MATERIAL_UNIFORMS
- /* clang-format on */
-} material;
-#endif
-
-/* clang-format off */
-VERTEX_SHADER_GLOBALS
-/* clang-format on */
-
-void main() {
-
- vec4 instance_custom = vec4(0.0);
-#ifdef USE_PRIMITIVE
-
- //weird bug,
- //this works
- vec2 vertex;
- vec2 uv;
- vec4 color;
-
- if (gl_VertexIndex == 0) {
- vertex = draw_data.points[0];
- uv = draw_data.uvs[0];
- color = vec4(unpackHalf2x16(draw_data.colors[0]), unpackHalf2x16(draw_data.colors[1]));
- } else if (gl_VertexIndex == 1) {
- vertex = draw_data.points[1];
- uv = draw_data.uvs[1];
- color = vec4(unpackHalf2x16(draw_data.colors[2]), unpackHalf2x16(draw_data.colors[3]));
- } else {
- vertex = draw_data.points[2];
- uv = draw_data.uvs[2];
- color = vec4(unpackHalf2x16(draw_data.colors[4]), unpackHalf2x16(draw_data.colors[5]));
- }
- uvec4 bones = uvec4(0, 0, 0, 0);
-
-#elif defined(USE_ATTRIBUTES)
-
- vec2 vertex = vertex_attrib;
- vec4 color = color_attrib;
- vec2 uv = uv_attrib;
-
- uvec4 bones = bones_attrib;
-#else
-
- vec2 vertex_base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0));
- vec2 vertex_base = vertex_base_arr[gl_VertexIndex];
-
- vec2 uv = draw_data.src_rect.xy + abs(draw_data.src_rect.zw) * ((draw_data.flags & FLAGS_TRANSPOSE_RECT) != 0 ? vertex_base.yx : vertex_base.xy);
- vec4 color = draw_data.modulation;
- vec2 vertex = draw_data.dst_rect.xy + abs(draw_data.dst_rect.zw) * mix(vertex_base, vec2(1.0, 1.0) - vertex_base, lessThan(draw_data.src_rect.zw, vec2(0.0, 0.0)));
- uvec4 bones = uvec4(0, 0, 0, 0);
-
-#endif
-
- mat4 world_matrix = mat4(vec4(draw_data.world_x, 0.0, 0.0), vec4(draw_data.world_y, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(draw_data.world_ofs, 0.0, 1.0));
-
-#if 0
- if (draw_data.flags & FLAGS_INSTANCING_ENABLED) {
-
- uint offset = draw_data.flags & FLAGS_INSTANCING_STRIDE_MASK;
- offset *= gl_InstanceIndex;
- mat4 instance_xform = mat4(
- vec4(texelFetch(instancing_buffer, offset + 0), texelFetch(instancing_buffer, offset + 1), 0.0, texelFetch(instancing_buffer, offset + 3)),
- vec4(texelFetch(instancing_buffer, offset + 4), texelFetch(instancing_buffer, offset + 5), 0.0, texelFetch(instancing_buffer, offset + 7)),
- vec4(0.0, 0.0, 1.0, 0.0),
- vec4(0.0, 0.0, 0.0, 1.0));
- offset += 8;
- if (draw_data.flags & FLAGS_INSTANCING_HAS_COLORS) {
- vec4 instance_color;
- if (draw_data.flags & FLAGS_INSTANCING_COLOR_8_BIT) {
- uint bits = floatBitsToUint(texelFetch(instancing_buffer, offset));
- instance_color = unpackUnorm4x8(bits);
- offset += 1;
- } else {
- instance_color = vec4(texelFetch(instancing_buffer, offset + 0), texelFetch(instancing_buffer, offset + 1), texelFetch(instancing_buffer, offset + 2), texelFetch(instancing_buffer, offset + 3));
- offser += 4;
- }
-
- color *= instance_color;
- }
- if (draw_data.flags & FLAGS_INSTANCING_HAS_CUSTOM_DATA) {
- if (draw_data.flags & FLAGS_INSTANCING_CUSTOM_DATA_8_BIT) {
- uint bits = floatBitsToUint(texelFetch(instancing_buffer, offset));
- instance_custom = unpackUnorm4x8(bits);
- } else {
- instance_custom = vec4(texelFetch(instancing_buffer, offset + 0), texelFetch(instancing_buffer, offset + 1), texelFetch(instancing_buffer, offset + 2), texelFetch(instancing_buffer, offset + 3));
- }
- }
- }
-
-#endif
-
-#if !defined(USE_ATTRIBUTES) && !defined(USE_PRIMITIVE)
- if (bool(draw_data.flags & FLAGS_USING_PARTICLES)) {
- //scale by texture size
- vertex /= draw_data.color_texture_pixel_size;
- }
-#endif
-
-#ifdef USE_POINT_SIZE
- float point_size = 1.0;
-#endif
- {
- /* clang-format off */
-VERTEX_SHADER_CODE
- /* clang-format on */
- }
-
-#ifdef USE_NINEPATCH
- pixel_size_interp = abs(draw_data.dst_rect.zw) * vertex_base;
-#endif
-
-#if !defined(SKIP_TRANSFORM_USED)
- vertex = (world_matrix * vec4(vertex, 0.0, 1.0)).xy;
-#endif
-
- color_interp = color;
-
- if (bool(draw_data.flags & FLAGS_USE_PIXEL_SNAP)) {
-
- vertex = floor(vertex + 0.5);
- // precision issue on some hardware creates artifacts within texture
- // offset uv by a small amount to avoid
- uv += 1e-5;
- }
-
-#ifdef USE_ATTRIBUTES
-#if 0
- if (bool(draw_data.flags & FLAGS_USE_SKELETON) && bone_weights != vec4(0.0)) { //must be a valid bone
- //skeleton transform
-
- ivec4 bone_indicesi = ivec4(bone_indices);
-
- uvec2 tex_ofs = bone_indicesi.x * 2;
-
- mat2x4 m;
- m = mat2x4(
- texelFetch(skeleton_buffer, tex_ofs + 0),
- texelFetch(skeleton_buffer, tex_ofs + 1)) *
- bone_weights.x;
-
- tex_ofs = bone_indicesi.y * 2;
-
- m += mat2x4(
- texelFetch(skeleton_buffer, tex_ofs + 0),
- texelFetch(skeleton_buffer, tex_ofs + 1)) *
- bone_weights.y;
-
- tex_ofs = bone_indicesi.z * 2;
-
- m += mat2x4(
- texelFetch(skeleton_buffer, tex_ofs + 0),
- texelFetch(skeleton_buffer, tex_ofs + 1)) *
- bone_weights.z;
-
- tex_ofs = bone_indicesi.w * 2;
-
- m += mat2x4(
- texelFetch(skeleton_buffer, tex_ofs + 0),
- texelFetch(skeleton_buffer, tex_ofs + 1)) *
- bone_weights.w;
-
- mat4 bone_matrix = skeleton_data.skeleton_transform * transpose(mat4(m[0], m[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0))) * skeleton_data.skeleton_transform_inverse;
-
- //outvec = bone_matrix * outvec;
- }
-#endif
-#endif
-
- vertex = (canvas_data.canvas_transform * vec4(vertex, 0.0, 1.0)).xy;
-
- vertex_interp = vertex;
- uv_interp = uv;
-
- gl_Position = canvas_data.screen_transform * vec4(vertex, 0.0, 1.0);
-
-#ifdef USE_POINT_SIZE
- gl_PointSize = point_size;
-#endif
-}
-
-/* clang-format off */
-[fragment]
-
-#version 450
-
-VERSION_DEFINES
-
-#include "canvas_uniforms_inc.glsl"
-
-layout(location = 0) in vec2 uv_interp;
-/* clang-format on */
-layout(location = 1) in vec4 color_interp;
-layout(location = 2) in vec2 vertex_interp;
-
-#ifdef USE_NINEPATCH
-
-layout(location = 3) in vec2 pixel_size_interp;
-
-#endif
-
-layout(location = 0) out vec4 frag_color;
-
-#ifdef USE_MATERIAL_UNIFORMS
-layout(set = 1, binding = 1, std140) uniform MaterialUniforms{
- /* clang-format off */
-MATERIAL_UNIFORMS
- /* clang-format on */
-} material;
-#endif
-
-/* clang-format off */
-FRAGMENT_SHADER_GLOBALS
-/* clang-format on */
-
-#ifdef LIGHT_SHADER_CODE_USED
-
-vec4 light_compute(
- vec3 light_vertex,
- vec3 light_position,
- vec3 normal,
- vec4 light_color,
- float light_energy,
- vec4 specular_shininess,
- inout vec4 shadow_modulate,
- vec2 screen_uv,
- vec2 uv,
- vec4 color) {
-
- vec4 light = vec4(0.0);
- /* clang-format off */
-LIGHT_SHADER_CODE
- /* clang-format on */
- return light;
-}
-
-#endif
-
-#ifdef USE_NINEPATCH
-
-float map_ninepatch_axis(float pixel, float draw_size, float tex_pixel_size, float margin_begin, float margin_end, int np_repeat, inout int draw_center) {
-
- float tex_size = 1.0 / tex_pixel_size;
-
- if (pixel < margin_begin) {
- return pixel * tex_pixel_size;
- } else if (pixel >= draw_size - margin_end) {
- return (tex_size - (draw_size - pixel)) * tex_pixel_size;
- } else {
- if (!bool(draw_data.flags & FLAGS_NINEPACH_DRAW_CENTER)) {
- draw_center--;
- }
-
- // np_repeat is passed as uniform using NinePatchRect::AxisStretchMode enum.
- if (np_repeat == 0) { // Stretch.
- // Convert to ratio.
- float ratio = (pixel - margin_begin) / (draw_size - margin_begin - margin_end);
- // Scale to source texture.
- return (margin_begin + ratio * (tex_size - margin_begin - margin_end)) * tex_pixel_size;
- } else if (np_repeat == 1) { // Tile.
- // Convert to offset.
- float ofs = mod((pixel - margin_begin), tex_size - margin_begin - margin_end);
- // Scale to source texture.
- return (margin_begin + ofs) * tex_pixel_size;
- } else if (np_repeat == 2) { // Tile Fit.
- // Calculate scale.
- float src_area = draw_size - margin_begin - margin_end;
- float dst_area = tex_size - margin_begin - margin_end;
- float scale = max(1.0, floor(src_area / max(dst_area, 0.0000001) + 0.5));
- // Convert to ratio.
- float ratio = (pixel - margin_begin) / src_area;
- ratio = mod(ratio * scale, 1.0);
- // Scale to source texture.
- return (margin_begin + ratio * dst_area) * tex_pixel_size;
- } else { // Shouldn't happen, but silences compiler warning.
- return 0.0;
- }
- }
-}
-
-#endif
-
-void main() {
-
- vec4 color = color_interp;
- vec2 uv = uv_interp;
- vec2 vertex = vertex_interp;
-
-#if !defined(USE_ATTRIBUTES) && !defined(USE_PRIMITIVE)
-
-#ifdef USE_NINEPATCH
-
- int draw_center = 2;
- uv = vec2(
- map_ninepatch_axis(pixel_size_interp.x, abs(draw_data.dst_rect.z), draw_data.color_texture_pixel_size.x, draw_data.ninepatch_margins.x, draw_data.ninepatch_margins.z, int(draw_data.flags >> FLAGS_NINEPATCH_H_MODE_SHIFT) & 0x3, draw_center),
- map_ninepatch_axis(pixel_size_interp.y, abs(draw_data.dst_rect.w), draw_data.color_texture_pixel_size.y, draw_data.ninepatch_margins.y, draw_data.ninepatch_margins.w, int(draw_data.flags >> FLAGS_NINEPATCH_V_MODE_SHIFT) & 0x3, draw_center));
-
- if (draw_center == 0) {
- color.a = 0.0;
- }
-
- uv = uv * draw_data.src_rect.zw + draw_data.src_rect.xy; //apply region if needed
-
-#endif
- if (bool(draw_data.flags & FLAGS_CLIP_RECT_UV)) {
-
- uv = clamp(uv, draw_data.src_rect.xy, draw_data.src_rect.xy + abs(draw_data.src_rect.zw));
- }
-
-#endif
-
- color *= texture(sampler2D(color_texture, texture_sampler), uv);
-
- uint light_count = (draw_data.flags >> FLAGS_LIGHT_COUNT_SHIFT) & 0xF; //max 16 lights
-
- vec3 normal;
-
-#if defined(NORMAL_USED)
-
- bool normal_used = true;
-#else
- bool normal_used = false;
-#endif
-
- if (normal_used || (light_count > 0 && bool(draw_data.flags & FLAGS_DEFAULT_NORMAL_MAP_USED))) {
- normal.xy = texture(sampler2D(normal_texture, texture_sampler), uv).xy * vec2(2.0, -2.0) - vec2(1.0, -1.0);
- normal.z = sqrt(1.0 - dot(normal.xy, normal.xy));
- normal_used = true;
- } else {
- normal = vec3(0.0, 0.0, 1.0);
- }
-
- vec4 specular_shininess;
-
-#if defined(SPECULAR_SHININESS_USED)
-
- bool specular_shininess_used = true;
-#else
- bool specular_shininess_used = false;
-#endif
-
- if (specular_shininess_used || (light_count > 0 && normal_used && bool(draw_data.flags & FLAGS_DEFAULT_SPECULAR_MAP_USED))) {
- specular_shininess = texture(sampler2D(specular_texture, texture_sampler), uv);
- specular_shininess *= unpackUnorm4x8(draw_data.specular_shininess);
- specular_shininess_used = true;
- } else {
- specular_shininess = vec4(1.0);
- }
-
-#if defined(SCREEN_UV_USED)
- vec2 screen_uv = gl_FragCoord.xy * canvas_data.screen_pixel_size;
-#else
- vec2 screen_uv = vec2(0.0);
-#endif
-
- vec3 light_vertex = vec3(vertex, 0.0);
- vec2 shadow_vertex = vertex;
-
- {
- float normal_depth = 1.0;
-
-#if defined(NORMALMAP_USED)
- vec3 normal_map = vec3(0.0, 0.0, 1.0);
- normal_used = true;
-#endif
-
- /* clang-format off */
-
-FRAGMENT_SHADER_CODE
-
- /* clang-format on */
-
-#if defined(NORMALMAP_USED)
- normal = mix(vec3(0.0, 0.0, 1.0), normal_map * vec3(2.0, -2.0, 1.0) - vec3(1.0, -1.0, 0.0), normal_depth);
-#endif
- }
-
- if (normal_used) {
- //convert by item transform
- normal.xy = mat2(normalize(draw_data.world_x), normalize(draw_data.world_y)) * normal.xy;
- //convert by canvas transform
- normal = normalize((canvas_data.canvas_normal_transform * vec4(normal, 0.0)).xyz);
- }
-
- vec4 base_color = color;
- if (bool(draw_data.flags & FLAGS_USING_LIGHT_MASK)) {
- color = vec4(0.0); //invisible by default due to using light mask
- }
-
- color *= canvas_data.canvas_modulation;
-#ifdef USE_LIGHTING
- for (uint i = 0; i < MAX_LIGHT_TEXTURES; i++) {
- if (i >= light_count) {
- break;
- }
- uint light_base;
- if (i < 8) {
- if (i < 4) {
- light_base = draw_data.lights[0];
- } else {
- light_base = draw_data.lights[1];
- }
- } else {
- if (i < 12) {
- light_base = draw_data.lights[2];
- } else {
- light_base = draw_data.lights[3];
- }
- }
- light_base >>= (i & 3) * 8;
- light_base &= 0xFF;
-
- vec2 tex_uv = (vec4(vertex, 0.0, 1.0) * mat4(light_array.data[light_base].texture_matrix[0], light_array.data[light_base].texture_matrix[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0))).xy; //multiply inverse given its transposed. Optimizer removes useless operations.
- vec4 light_color = texture(sampler2D(light_textures[i], texture_sampler), tex_uv);
- vec4 light_base_color = light_array.data[light_base].color;
-
-#ifdef LIGHT_SHADER_CODE_USED
-
- vec4 shadow_modulate = vec4(1.0);
- vec3 light_position = vec3(light_array.data[light_base].position, light_array.data[light_base].height);
-
- light_color.rgb *= light_base_color.rgb;
- light_color = light_compute(light_vertex, light_position, normal, light_color, light_base_color.a, specular_shininess, shadow_modulate, screen_uv, color, uv);
-#else
-
- light_color.rgb *= light_base_color.rgb * light_base_color.a;
-
- if (normal_used) {
-
- vec3 light_pos = vec3(light_array.data[light_base].position, light_array.data[light_base].height);
- vec3 pos = light_vertex;
- vec3 light_vec = normalize(light_pos - pos);
- float cNdotL = max(0.0, dot(normal, light_vec));
-
- if (specular_shininess_used) {
- //blinn
- vec3 view = vec3(0.0, 0.0, 1.0); // not great but good enough
- vec3 half_vec = normalize(view + light_vec);
-
- float cNdotV = max(dot(normal, view), 0.0);
- float cNdotH = max(dot(normal, half_vec), 0.0);
- float cVdotH = max(dot(view, half_vec), 0.0);
- float cLdotH = max(dot(light_vec, half_vec), 0.0);
- float shininess = exp2(15.0 * specular_shininess.a + 1.0) * 0.25;
- float blinn = pow(cNdotH, shininess);
- blinn *= (shininess + 8.0) * (1.0 / (8.0 * M_PI));
- float s = (blinn) / max(4.0 * cNdotV * cNdotL, 0.75);
-
- light_color.rgb = specular_shininess.rgb * light_base_color.rgb * s + light_color.rgb * cNdotL;
- } else {
- light_color.rgb *= cNdotL;
- }
- }
-#endif
- if (any(lessThan(tex_uv, vec2(0.0, 0.0))) || any(greaterThanEqual(tex_uv, vec2(1.0, 1.0)))) {
- //if outside the light texture, light color is zero
- light_color.a = 0.0;
- }
-
- if (bool(light_array.data[light_base].flags & LIGHT_FLAGS_HAS_SHADOW)) {
-
- vec2 shadow_pos = (vec4(shadow_vertex, 0.0, 1.0) * mat4(light_array.data[light_base].shadow_matrix[0], light_array.data[light_base].shadow_matrix[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0))).xy; //multiply inverse given its transposed. Optimizer removes useless operations.
-
- vec2 pos_norm = normalize(shadow_pos);
- vec2 pos_abs = abs(pos_norm);
- vec2 pos_box = pos_norm / max(pos_abs.x, pos_abs.y);
- vec2 pos_rot = pos_norm * mat2(vec2(0.7071067811865476, -0.7071067811865476), vec2(0.7071067811865476, 0.7071067811865476)); //is there a faster way to 45 degrees rot?
- float tex_ofs;
- float distance;
- if (pos_rot.y > 0) {
- if (pos_rot.x > 0) {
- tex_ofs = pos_box.y * 0.125 + 0.125;
- distance = shadow_pos.x;
- } else {
- tex_ofs = pos_box.x * -0.125 + (0.25 + 0.125);
- distance = shadow_pos.y;
- }
- } else {
- if (pos_rot.x < 0) {
- tex_ofs = pos_box.y * -0.125 + (0.5 + 0.125);
- distance = -shadow_pos.x;
- } else {
- tex_ofs = pos_box.x * 0.125 + (0.75 + 0.125);
- distance = -shadow_pos.y;
- }
- }
-
- //float distance = length(shadow_pos);
- float shadow;
- uint shadow_mode = light_array.data[light_base].flags & LIGHT_FLAGS_FILTER_MASK;
-
- vec4 shadow_uv = vec4(tex_ofs, 0.0, distance, 1.0);
-
- if (shadow_mode == LIGHT_FLAGS_SHADOW_NEAREST) {
- shadow = textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv).x;
- } else if (shadow_mode == LIGHT_FLAGS_SHADOW_PCF5) {
- vec4 shadow_pixel_size = vec4(light_array.data[light_base].shadow_pixel_size, 0.0, 0.0, 0.0);
- shadow = 0.0;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size * 2.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size * 2.0).x;
- shadow /= 5.0;
- } else { //PCF13
- vec4 shadow_pixel_size = vec4(light_array.data[light_base].shadow_pixel_size, 0.0, 0.0, 0.0);
- shadow = 0.0;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size * 6.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size * 5.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size * 4.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size * 3.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size * 2.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv - shadow_pixel_size).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size * 2.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size * 3.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size * 4.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size * 5.0).x;
- shadow += textureProj(sampler2DShadow(shadow_textures[i], shadow_sampler), shadow_uv + shadow_pixel_size * 6.0).x;
- shadow /= 13.0;
- }
-
- vec4 shadow_color = light_array.data[light_base].shadow_color;
-#ifdef LIGHT_SHADER_CODE_USED
- shadow_color *= shadow_modulate;
-#endif
- light_color = mix(light_color, shadow_color, shadow);
- }
-
- uint blend_mode = light_array.data[light_base].flags & LIGHT_FLAGS_BLEND_MASK;
-
- switch (blend_mode) {
- case LIGHT_FLAGS_BLEND_MODE_ADD: {
- color.rgb += light_color.rgb * light_color.a;
- } break;
- case LIGHT_FLAGS_BLEND_MODE_SUB: {
- color.rgb -= light_color.rgb * light_color.a;
- } break;
- case LIGHT_FLAGS_BLEND_MODE_MIX: {
- color.rgb = mix(color.rgb, light_color.rgb, light_color.a);
- } break;
- case LIGHT_FLAGS_BLEND_MODE_MASK: {
- light_color.a *= base_color.a;
- color.rgb = mix(color.rgb, light_color.rgb, light_color.a);
- } break;
- }
- }
-#endif
-
- frag_color = color;
-}
diff --git a/servers/visual/rasterizer_rd/shaders/canvas_occlusion.glsl b/servers/visual/rasterizer_rd/shaders/canvas_occlusion.glsl
deleted file mode 100644
index 7b30cc8fe9..0000000000
--- a/servers/visual/rasterizer_rd/shaders/canvas_occlusion.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-layout(location = 0) in highp vec3 vertex;
-/* clang-format on */
-
-layout(push_constant, binding = 0, std430) uniform Constants {
-
- mat4 projection;
- mat2x4 modelview;
- vec2 direction;
- vec2 pad;
-}
-constants;
-
-layout(location = 0) out highp float depth;
-
-void main() {
-
- highp vec4 vtx = vec4(vertex, 1.0) * mat4(constants.modelview[0], constants.modelview[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
- depth = dot(constants.direction, vtx.xy);
-
- gl_Position = constants.projection * vtx;
-}
-
-/* clang-format off */
-[fragment]
-
-#version 450
-
-layout(location = 0) in highp float depth;
-/* clang-format on */
-layout(location = 0) out highp float distance_buf;
-
-void main() {
-
- distance_buf = depth;
-}
diff --git a/servers/visual/rasterizer_rd/shaders/canvas_uniforms_inc.glsl b/servers/visual/rasterizer_rd/shaders/canvas_uniforms_inc.glsl
deleted file mode 100644
index 1ac43480cd..0000000000
--- a/servers/visual/rasterizer_rd/shaders/canvas_uniforms_inc.glsl
+++ /dev/null
@@ -1,141 +0,0 @@
-#define M_PI 3.14159265359
-
-#define FLAGS_INSTANCING_STRIDE_MASK 0xF
-#define FLAGS_INSTANCING_ENABLED (1 << 4)
-#define FLAGS_INSTANCING_HAS_COLORS (1 << 5)
-#define FLAGS_INSTANCING_COLOR_8BIT (1 << 6)
-#define FLAGS_INSTANCING_HAS_CUSTOM_DATA (1 << 7)
-#define FLAGS_INSTANCING_CUSTOM_DATA_8_BIT (1 << 8)
-
-#define FLAGS_CLIP_RECT_UV (1 << 9)
-#define FLAGS_TRANSPOSE_RECT (1 << 10)
-#define FLAGS_USING_LIGHT_MASK (1 << 11)
-#define FLAGS_NINEPACH_DRAW_CENTER (1 << 12)
-#define FLAGS_USING_PARTICLES (1 << 13)
-#define FLAGS_USE_PIXEL_SNAP (1 << 14)
-
-#define FLAGS_NINEPATCH_H_MODE_SHIFT 16
-#define FLAGS_NINEPATCH_V_MODE_SHIFT 18
-
-#define FLAGS_LIGHT_COUNT_SHIFT 20
-
-#define FLAGS_DEFAULT_NORMAL_MAP_USED (1 << 26)
-#define FLAGS_DEFAULT_SPECULAR_MAP_USED (1 << 27)
-
-// In vulkan, sets should always be ordered using the following logic:
-// Lower Sets: Sets that change format and layout less often
-// Higher sets: Sets that change format and layout very often
-// This is because changing a set for another with a different layout or format,
-// invalidates all the upper ones.
-
-/* SET0: Draw Primitive */
-
-layout(push_constant, binding = 0, std430) uniform DrawData {
- vec2 world_x;
- vec2 world_y;
- vec2 world_ofs;
- uint flags;
- uint specular_shininess;
-#ifdef USE_PRIMITIVE
- vec2 points[3];
- vec2 uvs[3];
- uint colors[6];
-#else
- vec4 modulation;
- vec4 ninepatch_margins;
- vec4 dst_rect; //for built-in rect and UV
- vec4 src_rect;
- vec2 pad;
-
-#endif
- vec2 color_texture_pixel_size;
- uint lights[4];
-}
-draw_data;
-
-// The values passed per draw primitives are cached within it
-
-layout(set = 0, binding = 1) uniform texture2D color_texture;
-layout(set = 0, binding = 2) uniform texture2D normal_texture;
-layout(set = 0, binding = 3) uniform texture2D specular_texture;
-layout(set = 0, binding = 4) uniform sampler texture_sampler;
-
-layout(set = 0, binding = 5) uniform textureBuffer instancing_buffer;
-
-/* SET1: Is reserved for the material */
-
-#ifdef USE_MATERIAL_SAMPLERS
-
-layout(set = 1, binding = 0) uniform sampler material_samplers[12];
-
-#endif
-
-/* SET2: Canvas Item State (including lighting) */
-
-layout(set = 2, binding = 0, std140) uniform CanvasData {
- mat4 canvas_transform;
- mat4 screen_transform;
- mat4 canvas_normal_transform;
- vec4 canvas_modulation;
- vec2 screen_pixel_size;
- float time;
- float time_pad;
- //uint light_count;
-}
-canvas_data;
-
-layout(set = 2, binding = 1) uniform textureBuffer skeleton_buffer;
-
-layout(set = 2, binding = 2, std140) uniform SkeletonData {
- mat4 skeleton_transform; //in world coordinates
- mat4 skeleton_transform_inverse;
-}
-skeleton_data;
-
-#ifdef USE_LIGHTING
-
-#define LIGHT_FLAGS_BLEND_MASK (3 << 16)
-#define LIGHT_FLAGS_BLEND_MODE_ADD (0 << 16)
-#define LIGHT_FLAGS_BLEND_MODE_SUB (1 << 16)
-#define LIGHT_FLAGS_BLEND_MODE_MIX (2 << 16)
-#define LIGHT_FLAGS_BLEND_MODE_MASK (3 << 16)
-#define LIGHT_FLAGS_HAS_SHADOW (1 << 20)
-#define LIGHT_FLAGS_FILTER_SHIFT 22
-#define LIGHT_FLAGS_FILTER_MASK (3 << 22)
-#define LIGHT_FLAGS_SHADOW_NEAREST (0 << 22)
-#define LIGHT_FLAGS_SHADOW_PCF5 (1 << 22)
-#define LIGHT_FLAGS_SHADOW_PCF13 (2 << 22)
-
-struct Light {
- mat2x4 texture_matrix; //light to texture coordinate matrix (transposed)
- mat2x4 shadow_matrix; //light to shadow coordinate matrix (transposed)
- vec4 color;
- vec4 shadow_color;
- vec2 position;
- uint flags; //index to light texture
- float height;
- float shadow_pixel_size;
- float pad0;
- float pad1;
- float pad2;
-};
-
-layout(set = 2, binding = 3, std140) uniform LightData {
- Light data[MAX_LIGHTS];
-}
-light_array;
-
-layout(set = 2, binding = 4) uniform texture2D light_textures[MAX_LIGHT_TEXTURES];
-layout(set = 2, binding = 5) uniform texture2D shadow_textures[MAX_LIGHT_TEXTURES];
-
-layout(set = 2, binding = 6) uniform sampler shadow_sampler;
-
-#endif
-
-/* SET3: Render Target Data */
-
-#ifdef SCREEN_TEXTURE_USED
-
-layout(set = 3, binding = 0) uniform texture2D screen_texture;
-
-#endif
diff --git a/servers/visual/rasterizer_rd/shaders/copy.glsl b/servers/visual/rasterizer_rd/shaders/copy.glsl
deleted file mode 100644
index cbb9b546a3..0000000000
--- a/servers/visual/rasterizer_rd/shaders/copy.glsl
+++ /dev/null
@@ -1,86 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-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
-
-layout(location = 0) in vec2 uv_interp;
-/* clang-format on */
-
-#ifdef MODE_CUBE_TO_DP
-
-layout(set = 0, binding = 0) uniform samplerCube source_cube;
-
-layout(push_constant, binding = 0, std430) uniform Params {
- float bias;
- float z_far;
- float z_near;
- bool z_flip;
-}
-params;
-
-layout(location = 0) out float depth_buffer;
-
-#endif
-
-void main() {
-
-#ifdef MODE_CUBE_TO_DP
-
- vec3 normal = vec3(uv_interp * 2.0 - 1.0, 0.0);
-
- normal.z = 0.5 - 0.5 * ((normal.x * normal.x) + (normal.y * normal.y));
- normal = normalize(normal);
-
- normal.y = -normal.y; //needs to be flipped to match projection matrix
- if (!params.z_flip) {
- normal.z = -normal.z;
- }
-
- float depth = texture(source_cube, normal).r;
-
- // absolute values for direction cosines, bigger value equals closer to basis axis
- vec3 unorm = abs(normal);
-
- if ((unorm.x >= unorm.y) && (unorm.x >= unorm.z)) {
- // x code
- unorm = normal.x > 0.0 ? vec3(1.0, 0.0, 0.0) : vec3(-1.0, 0.0, 0.0);
- } else if ((unorm.y > unorm.x) && (unorm.y >= unorm.z)) {
- // y code
- unorm = normal.y > 0.0 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, -1.0, 0.0);
- } else if ((unorm.z > unorm.x) && (unorm.z > unorm.y)) {
- // z code
- unorm = normal.z > 0.0 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 0.0, -1.0);
- } else {
- // oh-no we messed up code
- // has to be
- unorm = vec3(1.0, 0.0, 0.0);
- }
-
- float depth_fix = 1.0 / dot(normal, unorm);
-
- depth = 2.0 * depth - 1.0;
- float linear_depth = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - depth * (params.z_far - params.z_near));
- depth_buffer = (linear_depth * depth_fix + params.bias) / params.z_far;
-
-#endif
-}
diff --git a/servers/visual/rasterizer_rd/shaders/cubemap_downsampler.glsl b/servers/visual/rasterizer_rd/shaders/cubemap_downsampler.glsl
deleted file mode 100644
index b9cb0e848c..0000000000
--- a/servers/visual/rasterizer_rd/shaders/cubemap_downsampler.glsl
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2016 Activision Publishing, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the Software
-// is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-/* clang-format off */
-[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;
-/* clang-format on */
-
-#ifdef MODE_SOURCE_PANORAMA
-layout(set = 0, binding = 0) uniform sampler2D source_panorama;
-#endif
-
-#ifdef MODE_SOURCE_CUBEMAP
-layout(set = 0, binding = 0) uniform samplerCube source_cubemap;
-#endif
-
-layout(rgba16f, set = 1, binding = 0) uniform restrict writeonly imageCube dest_cubemap;
-
-layout(push_constant, binding = 1, std430) uniform Params {
- uint face_size;
-}
-params;
-
-#define M_PI 3.14159265359
-
-void get_dir_0(out vec3 dir, in float u, in float v) {
- dir[0] = 1.0;
- dir[1] = v;
- dir[2] = -u;
-}
-void get_dir_1(out vec3 dir, in float u, in float v) {
- dir[0] = -1.0;
- dir[1] = v;
- dir[2] = u;
-}
-void get_dir_2(out vec3 dir, in float u, in float v) {
- dir[0] = u;
- dir[1] = 1.0;
- dir[2] = -v;
-}
-void get_dir_3(out vec3 dir, in float u, in float v) {
- dir[0] = u;
- dir[1] = -1.0;
- dir[2] = v;
-}
-void get_dir_4(out vec3 dir, in float u, in float v) {
- dir[0] = u;
- dir[1] = v;
- dir[2] = 1.0;
-}
-void get_dir_5(out vec3 dir, in float u, in float v) {
- dir[0] = -u;
- dir[1] = v;
- dir[2] = -1.0;
-}
-
-float calcWeight(float u, float v) {
- float val = u * u + v * v + 1.0;
- return val * sqrt(val);
-}
-
-#ifdef MODE_SOURCE_PANORAMA
-
-vec4 texturePanorama(vec3 normal, sampler2D pano) {
-
- vec2 st = vec2(
- atan(normal.x, -normal.z),
- acos(normal.y));
-
- if (st.x < 0.0)
- st.x += M_PI * 2.0;
-
- st /= vec2(M_PI * 2.0, M_PI);
-
- return textureLod(pano, st, 0.0);
-}
-
-#endif
-
-vec4 get_texture(vec3 p_dir) {
-#ifdef MODE_SOURCE_PANORAMA
- return texturePanorama(normalize(p_dir), source_panorama);
-#else
- return textureLod(source_cubemap, normalize(p_dir), 0.0);
-#endif
-}
-
-void main() {
- uvec3 id = gl_GlobalInvocationID;
- uint face_size = params.face_size;
-
- if (id.x < face_size && id.y < face_size) {
- float inv_face_size = 1.0 / float(face_size);
-
- float u0 = (float(id.x) * 2.0 + 1.0 - 0.75) * inv_face_size - 1.0;
- float u1 = (float(id.x) * 2.0 + 1.0 + 0.75) * inv_face_size - 1.0;
-
- float v0 = (float(id.y) * 2.0 + 1.0 - 0.75) * -inv_face_size + 1.0;
- float v1 = (float(id.y) * 2.0 + 1.0 + 0.75) * -inv_face_size + 1.0;
-
- float weights[4];
- weights[0] = calcWeight(u0, v0);
- weights[1] = calcWeight(u1, v0);
- weights[2] = calcWeight(u0, v1);
- weights[3] = calcWeight(u1, v1);
-
- const float wsum = 0.5 / (weights[0] + weights[1] + weights[2] + weights[3]);
- for (int i = 0; i < 4; i++) {
- weights[i] = weights[i] * wsum + .125;
- }
-
- vec3 dir;
- vec4 color;
- switch (id.z) {
- case 0:
- get_dir_0(dir, u0, v0);
- color = get_texture(dir) * weights[0];
-
- get_dir_0(dir, u1, v0);
- color += get_texture(dir) * weights[1];
-
- get_dir_0(dir, u0, v1);
- color += get_texture(dir) * weights[2];
-
- get_dir_0(dir, u1, v1);
- color += get_texture(dir) * weights[3];
- break;
- case 1:
- get_dir_1(dir, u0, v0);
- color = get_texture(dir) * weights[0];
-
- get_dir_1(dir, u1, v0);
- color += get_texture(dir) * weights[1];
-
- get_dir_1(dir, u0, v1);
- color += get_texture(dir) * weights[2];
-
- get_dir_1(dir, u1, v1);
- color += get_texture(dir) * weights[3];
- break;
- case 2:
- get_dir_2(dir, u0, v0);
- color = get_texture(dir) * weights[0];
-
- get_dir_2(dir, u1, v0);
- color += get_texture(dir) * weights[1];
-
- get_dir_2(dir, u0, v1);
- color += get_texture(dir) * weights[2];
-
- get_dir_2(dir, u1, v1);
- color += get_texture(dir) * weights[3];
- break;
- case 3:
- get_dir_3(dir, u0, v0);
- color = get_texture(dir) * weights[0];
-
- get_dir_3(dir, u1, v0);
- color += get_texture(dir) * weights[1];
-
- get_dir_3(dir, u0, v1);
- color += get_texture(dir) * weights[2];
-
- get_dir_3(dir, u1, v1);
- color += get_texture(dir) * weights[3];
- break;
- case 4:
- get_dir_4(dir, u0, v0);
- color = get_texture(dir) * weights[0];
-
- get_dir_4(dir, u1, v0);
- color += get_texture(dir) * weights[1];
-
- get_dir_4(dir, u0, v1);
- color += get_texture(dir) * weights[2];
-
- get_dir_4(dir, u1, v1);
- color += get_texture(dir) * weights[3];
- break;
- default:
- get_dir_5(dir, u0, v0);
- color = get_texture(dir) * weights[0];
-
- get_dir_5(dir, u1, v0);
- color += get_texture(dir) * weights[1];
-
- get_dir_5(dir, u0, v1);
- color += get_texture(dir) * weights[2];
-
- get_dir_5(dir, u1, v1);
- color += get_texture(dir) * weights[3];
- break;
- }
- imageStore(dest_cubemap, ivec3(id), color);
- }
-}
diff --git a/servers/visual/rasterizer_rd/shaders/cubemap_filter.glsl b/servers/visual/rasterizer_rd/shaders/cubemap_filter.glsl
deleted file mode 100644
index dd06647d3d..0000000000
--- a/servers/visual/rasterizer_rd/shaders/cubemap_filter.glsl
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2016 Activision Publishing, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the Software
-// is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-#define GROUP_SIZE 64
-
-layout(local_size_x = GROUP_SIZE, local_size_y = 1, local_size_z = 1) in;
-/* clang-format on */
-
-layout(set = 0, binding = 0) uniform samplerCube source_cubemap;
-layout(rgba16f, set = 2, binding = 0) uniform restrict writeonly imageCube dest_cubemap0;
-layout(rgba16f, set = 2, binding = 1) uniform restrict writeonly imageCube dest_cubemap1;
-layout(rgba16f, set = 2, binding = 2) uniform restrict writeonly imageCube dest_cubemap2;
-layout(rgba16f, set = 2, binding = 3) uniform restrict writeonly imageCube dest_cubemap3;
-layout(rgba16f, set = 2, binding = 4) uniform restrict writeonly imageCube dest_cubemap4;
-layout(rgba16f, set = 2, binding = 5) uniform restrict writeonly imageCube dest_cubemap5;
-layout(rgba16f, set = 2, binding = 6) uniform restrict writeonly imageCube dest_cubemap6;
-
-#ifdef USE_HIGH_QUALITY
-#define NUM_TAPS 32
-#else
-#define NUM_TAPS 8
-#endif
-
-#define BASE_RESOLUTION 128
-
-#ifdef USE_HIGH_QUALITY
-layout(set = 1, binding = 0, std430) buffer restrict readonly Data {
- vec4[7][5][3][24] coeffs;
-}
-data;
-#else
-layout(set = 1, binding = 0, std430) buffer restrict readonly Data {
- vec4[7][5][6] coeffs;
-}
-data;
-#endif
-
-void get_dir(out vec3 dir, in vec2 uv, in uint face) {
- switch (face) {
- case 0:
- dir = vec3(1.0, uv[1], -uv[0]);
- break;
- case 1:
- dir = vec3(-1.0, uv[1], uv[0]);
- break;
- case 2:
- dir = vec3(uv[0], 1.0, -uv[1]);
- break;
- case 3:
- dir = vec3(uv[0], -1.0, uv[1]);
- break;
- case 4:
- dir = vec3(uv[0], uv[1], 1.0);
- break;
- default:
- dir = vec3(-uv[0], uv[1], -1.0);
- break;
- }
-}
-
-void main() {
- // INPUT:
- // id.x = the linear address of the texel (ignoring face)
- // id.y = the face
- // -> use to index output texture
- // id.x = texel x
- // id.y = texel y
- // id.z = face
- uvec3 id = gl_GlobalInvocationID;
-
- // determine which texel this is
-#ifndef USE_TEXTURE_ARRAY
- int level = 0;
- if (id.x < (128 * 128)) {
- level = 0;
- } else if (id.x < (128 * 128 + 64 * 64)) {
- level = 1;
- id.x -= (128 * 128);
- } else if (id.x < (128 * 128 + 64 * 64 + 32 * 32)) {
- level = 2;
- id.x -= (128 * 128 + 64 * 64);
- } else if (id.x < (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16)) {
- level = 3;
- id.x -= (128 * 128 + 64 * 64 + 32 * 32);
- } else if (id.x < (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8)) {
- level = 4;
- id.x -= (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16);
- } else if (id.x < (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4)) {
- level = 5;
- id.x -= (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8);
- } else if (id.x < (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2)) {
- level = 6;
- id.x -= (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4);
- } else {
- return;
- }
- int res = BASE_RESOLUTION >> level;
-#else // Using Texture Arrays so all levels are the same resolution
- int res = BASE_RESOLUTION;
- int level = int(id.x / (BASE_RESOLUTION * BASE_RESOLUTION));
- id.x -= level * BASE_RESOLUTION * BASE_RESOLUTION;
-#endif
-
- // determine dir / pos for the texel
- vec3 dir, adir, frameZ;
- {
- id.z = id.y;
- id.y = id.x / res;
- id.x -= id.y * res;
-
- vec2 uv;
- uv.x = (float(id.x) * 2.0 + 1.0) / float(res) - 1.0;
- uv.y = -(float(id.y) * 2.0 + 1.0) / float(res) + 1.0;
-
- get_dir(dir, uv, id.z);
- frameZ = normalize(dir);
-
- adir = abs(dir);
- }
-
- // GGX gather colors
- vec4 color = vec4(0.0);
- for (int axis = 0; axis < 3; axis++) {
- const int otherAxis0 = 1 - (axis & 1) - (axis >> 1);
- const int otherAxis1 = 2 - (axis >> 1);
-
- float frameweight = (max(adir[otherAxis0], adir[otherAxis1]) - .75) / .25;
- if (frameweight > 0.0) {
- // determine frame
- vec3 UpVector;
- switch (axis) {
- case 0:
- UpVector = vec3(1, 0, 0);
- break;
- case 1:
- UpVector = vec3(0, 1, 0);
- break;
- default:
- UpVector = vec3(0, 0, 1);
- break;
- }
-
- vec3 frameX = normalize(cross(UpVector, frameZ));
- vec3 frameY = cross(frameZ, frameX);
-
- // calculate parametrization for polynomial
- float Nx = dir[otherAxis0];
- float Ny = dir[otherAxis1];
- float Nz = adir[axis];
-
- float NmaxXY = max(abs(Ny), abs(Nx));
- Nx /= NmaxXY;
- Ny /= NmaxXY;
-
- float theta;
- if (Ny < Nx) {
- if (Ny <= -0.999)
- theta = Nx;
- else
- theta = Ny;
- } else {
- if (Ny >= 0.999)
- theta = -Nx;
- else
- theta = -Ny;
- }
-
- float phi;
- if (Nz <= -0.999)
- phi = -NmaxXY;
- else if (Nz >= 0.999)
- phi = NmaxXY;
- else
- phi = Nz;
-
- float theta2 = theta * theta;
- float phi2 = phi * phi;
-
- // sample
- for (int iSuperTap = 0; iSuperTap < NUM_TAPS / 4; iSuperTap++) {
- const int index = (NUM_TAPS / 4) * axis + iSuperTap;
-
-#ifdef USE_HIGH_QUALITY
- vec4 coeffsDir0[3];
- vec4 coeffsDir1[3];
- vec4 coeffsDir2[3];
- vec4 coeffsLevel[3];
- vec4 coeffsWeight[3];
-
- for (int iCoeff = 0; iCoeff < 3; iCoeff++) {
- coeffsDir0[iCoeff] = data.coeffs[level][0][iCoeff][index];
- coeffsDir1[iCoeff] = data.coeffs[level][1][iCoeff][index];
- coeffsDir2[iCoeff] = data.coeffs[level][2][iCoeff][index];
- coeffsLevel[iCoeff] = data.coeffs[level][3][iCoeff][index];
- coeffsWeight[iCoeff] = data.coeffs[level][4][iCoeff][index];
- }
-
- for (int iSubTap = 0; iSubTap < 4; iSubTap++) {
- // determine sample attributes (dir, weight, level)
- vec3 sample_dir = frameX * (coeffsDir0[0][iSubTap] + coeffsDir0[1][iSubTap] * theta2 + coeffsDir0[2][iSubTap] * phi2) + frameY * (coeffsDir1[0][iSubTap] + coeffsDir1[1][iSubTap] * theta2 + coeffsDir1[2][iSubTap] * phi2) + frameZ * (coeffsDir2[0][iSubTap] + coeffsDir2[1][iSubTap] * theta2 + coeffsDir2[2][iSubTap] * phi2);
-
- float sample_level = coeffsLevel[0][iSubTap] + coeffsLevel[1][iSubTap] * theta2 + coeffsLevel[2][iSubTap] * phi2;
-
- float sample_weight = coeffsWeight[0][iSubTap] + coeffsWeight[1][iSubTap] * theta2 + coeffsWeight[2][iSubTap] * phi2;
-#else
- vec4 coeffsDir0 = data.coeffs[level][0][index];
- vec4 coeffsDir1 = data.coeffs[level][1][index];
- vec4 coeffsDir2 = data.coeffs[level][2][index];
- vec4 coeffsLevel = data.coeffs[level][3][index];
- vec4 coeffsWeight = data.coeffs[level][4][index];
-
- for (int iSubTap = 0; iSubTap < 4; iSubTap++) {
- // determine sample attributes (dir, weight, level)
- vec3 sample_dir = frameX * coeffsDir0[iSubTap] + frameY * coeffsDir1[iSubTap] + frameZ * coeffsDir2[iSubTap];
-
- float sample_level = coeffsLevel[iSubTap];
-
- float sample_weight = coeffsWeight[iSubTap];
-#endif
-
- sample_weight *= frameweight;
-
- // adjust for jacobian
- sample_dir /= max(abs(sample_dir[0]), max(abs(sample_dir[1]), abs(sample_dir[2])));
- sample_level += 0.75 * log2(dot(sample_dir, sample_dir));
-#ifndef USE_TEXTURE_ARRAY
- sample_level += float(level) / 6.0; // Hack to increase the perceived roughness and reduce upscaling artifacts
-#endif
- // sample cubemap
- color.xyz += textureLod(source_cubemap, normalize(sample_dir), sample_level).xyz * sample_weight;
- color.w += sample_weight;
- }
- }
- }
- }
- color /= color.w;
-
- // write color
- color.xyz = max(vec3(0.0), color.xyz);
- color.w = 1.0;
-
- switch (level) {
- case 0:
- imageStore(dest_cubemap0, ivec3(id), color);
- break;
- case 1:
- imageStore(dest_cubemap1, ivec3(id), color);
- break;
- case 2:
- imageStore(dest_cubemap2, ivec3(id), color);
- break;
- case 3:
- imageStore(dest_cubemap3, ivec3(id), color);
- break;
- case 4:
- imageStore(dest_cubemap4, ivec3(id), color);
- break;
- case 5:
- imageStore(dest_cubemap5, ivec3(id), color);
- break;
- default:
- imageStore(dest_cubemap6, ivec3(id), color);
- break;
- }
-}
diff --git a/servers/visual/rasterizer_rd/shaders/cubemap_roughness.glsl b/servers/visual/rasterizer_rd/shaders/cubemap_roughness.glsl
deleted file mode 100644
index 3dba143e56..0000000000
--- a/servers/visual/rasterizer_rd/shaders/cubemap_roughness.glsl
+++ /dev/null
@@ -1,184 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-#define GROUP_SIZE 8
-
-layout(local_size_x = GROUP_SIZE, local_size_y = GROUP_SIZE, local_size_z = 1) in;
-/* clang-format on */
-
-#ifdef MODE_SOURCE_PANORAMA
-layout(set = 0, binding = 0) uniform sampler2D source_panorama;
-#endif
-
-#ifdef MODE_SOURCE_CUBEMAP
-layout(set = 0, binding = 0) uniform samplerCube source_cube;
-#endif
-
-layout(rgba16f, set = 1, binding = 0) uniform restrict writeonly imageCube dest_cubemap;
-
-layout(push_constant, binding = 1, std430) uniform Params {
- uint face_id;
- uint sample_count;
- float roughness;
- bool use_direct_write;
- float face_size;
-}
-params;
-
-#define M_PI 3.14159265359
-
-vec3 texelCoordToVec(vec2 uv, uint faceID) {
- mat3 faceUvVectors[6];
-
- // -x
- faceUvVectors[1][0] = vec3(0.0, 0.0, 1.0); // u -> +z
- faceUvVectors[1][1] = vec3(0.0, -1.0, 0.0); // v -> -y
- faceUvVectors[1][2] = vec3(-1.0, 0.0, 0.0); // -x face
-
- // +x
- faceUvVectors[0][0] = vec3(0.0, 0.0, -1.0); // u -> -z
- faceUvVectors[0][1] = vec3(0.0, -1.0, 0.0); // v -> -y
- faceUvVectors[0][2] = vec3(1.0, 0.0, 0.0); // +x face
-
- // -y
- faceUvVectors[3][0] = vec3(1.0, 0.0, 0.0); // u -> +x
- faceUvVectors[3][1] = vec3(0.0, 0.0, -1.0); // v -> -z
- faceUvVectors[3][2] = vec3(0.0, -1.0, 0.0); // -y face
-
- // +y
- faceUvVectors[2][0] = vec3(1.0, 0.0, 0.0); // u -> +x
- faceUvVectors[2][1] = vec3(0.0, 0.0, 1.0); // v -> +z
- faceUvVectors[2][2] = vec3(0.0, 1.0, 0.0); // +y face
-
- // -z
- faceUvVectors[5][0] = vec3(-1.0, 0.0, 0.0); // u -> -x
- faceUvVectors[5][1] = vec3(0.0, -1.0, 0.0); // v -> -y
- faceUvVectors[5][2] = vec3(0.0, 0.0, -1.0); // -z face
-
- // +z
- faceUvVectors[4][0] = vec3(1.0, 0.0, 0.0); // u -> +x
- faceUvVectors[4][1] = vec3(0.0, -1.0, 0.0); // v -> -y
- faceUvVectors[4][2] = vec3(0.0, 0.0, 1.0); // +z face
-
- // out = u * s_faceUv[0] + v * s_faceUv[1] + s_faceUv[2].
- vec3 result = (faceUvVectors[faceID][0] * uv.x) + (faceUvVectors[faceID][1] * uv.y) + faceUvVectors[faceID][2];
- return normalize(result);
-}
-
-vec3 ImportanceSampleGGX(vec2 Xi, float Roughness, vec3 N) {
- float a = Roughness * Roughness; // DISNEY'S ROUGHNESS [see Burley'12 siggraph]
-
- // Compute distribution direction
- float Phi = 2.0 * M_PI * Xi.x;
- float CosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a * a - 1.0) * Xi.y));
- float SinTheta = sqrt(1.0 - CosTheta * CosTheta);
-
- // Convert to spherical direction
- vec3 H;
- H.x = SinTheta * cos(Phi);
- H.y = SinTheta * sin(Phi);
- H.z = CosTheta;
-
- vec3 UpVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
- vec3 TangentX = normalize(cross(UpVector, N));
- vec3 TangentY = cross(N, TangentX);
-
- // Tangent to world space
- return TangentX * H.x + TangentY * H.y + N * H.z;
-}
-
-// http://graphicrants.blogspot.com.au/2013/08/specular-brdf-reference.html
-float GGX(float NdotV, float a) {
- float k = a / 2.0;
- return NdotV / (NdotV * (1.0 - k) + k);
-}
-
-// http://graphicrants.blogspot.com.au/2013/08/specular-brdf-reference.html
-float G_Smith(float a, float nDotV, float nDotL) {
- return GGX(nDotL, a * a) * GGX(nDotV, a * a);
-}
-
-float radicalInverse_VdC(uint bits) {
- bits = (bits << 16u) | (bits >> 16u);
- bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
- bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
- bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
- bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
- return float(bits) * 2.3283064365386963e-10; // / 0x100000000
-}
-
-vec2 Hammersley(uint i, uint N) {
- return vec2(float(i) / float(N), radicalInverse_VdC(i));
-}
-
-#ifdef MODE_SOURCE_PANORAMA
-
-vec4 texturePanorama(vec3 normal, sampler2D pano) {
-
- vec2 st = vec2(
- atan(normal.x, -normal.z),
- acos(normal.y));
-
- if (st.x < 0.0)
- st.x += M_PI * 2.0;
-
- st /= vec2(M_PI * 2.0, M_PI);
-
- return textureLod(pano, st, 0.0);
-}
-
-#endif
-
-void main() {
- uvec3 id = gl_GlobalInvocationID;
- id.z += params.face_id;
-
- vec2 uv = ((vec2(id.xy) * 2.0 + 1.0) / (params.face_size) - 1.0);
- vec3 N = texelCoordToVec(uv, id.z);
-
- //vec4 color = color_interp;
-
- if (params.use_direct_write) {
-
-#ifdef MODE_SOURCE_PANORAMA
- imageStore(dest_cubemap, ivec3(id), vec4(texturePanorama(N, source_panorama).rgb, 1.0));
-#endif
-
-#ifdef MODE_SOURCE_CUBEMAP
- imageStore(dest_cubemap, ivec3(id), vec4(texture(source_cube, N).rgb, 1.0));
-
-#endif
-
- } else {
-
- vec4 sum = vec4(0.0, 0.0, 0.0, 0.0);
-
- for (uint sampleNum = 0u; sampleNum < params.sample_count; sampleNum++) {
- vec2 xi = Hammersley(sampleNum, params.sample_count);
-
- vec3 H = ImportanceSampleGGX(xi, params.roughness, N);
- vec3 V = N;
- vec3 L = (2.0 * dot(V, H) * H - V);
-
- float ndotl = clamp(dot(N, L), 0.0, 1.0);
-
- if (ndotl > 0.0) {
-#ifdef MODE_SOURCE_PANORAMA
- sum.rgb += texturePanorama(L, source_panorama).rgb * ndotl;
-#endif
-
-#ifdef MODE_SOURCE_CUBEMAP
- sum.rgb += textureLod(source_cube, L, 0.0).rgb * ndotl;
-#endif
- sum.a += ndotl;
- }
- }
- sum /= sum.a;
-
- imageStore(dest_cubemap, ivec3(id), vec4(sum.rgb, 1.0));
- }
-}
diff --git a/servers/visual/rasterizer_rd/shaders/giprobe.glsl b/servers/visual/rasterizer_rd/shaders/giprobe.glsl
deleted file mode 100644
index fd09f96a57..0000000000
--- a/servers/visual/rasterizer_rd/shaders/giprobe.glsl
+++ /dev/null
@@ -1,788 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-#ifdef MODE_DYNAMIC
-layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-#else
-layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
-#endif
-/* clang-format on */
-
-#ifndef MODE_DYNAMIC
-
-#define NO_CHILDREN 0xFFFFFFFF
-#define GREY_VEC vec3(0.33333, 0.33333, 0.33333)
-
-struct CellChildren {
- uint children[8];
-};
-
-layout(set = 0, binding = 1, std430) buffer CellChildrenBuffer {
- CellChildren data[];
-}
-cell_children;
-
-struct CellData {
- uint position; // xyz 10 bits
- uint albedo; //rgb albedo
- uint emission; //rgb normalized with e as multiplier
- uint normal; //RGB normal encoded
-};
-
-layout(set = 0, binding = 2, std430) buffer CellDataBuffer {
- CellData data[];
-}
-cell_data;
-
-#endif // MODE DYNAMIC
-
-#define LIGHT_TYPE_DIRECTIONAL 0
-#define LIGHT_TYPE_OMNI 1
-#define LIGHT_TYPE_SPOT 2
-
-#if defined(MODE_COMPUTE_LIGHT) || defined(MODE_DYNAMIC_LIGHTING)
-
-struct Light {
-
- uint type;
- float energy;
- float radius;
- float attenuation;
-
- vec3 color;
- float spot_angle_radians;
-
- vec3 position;
- float spot_attenuation;
-
- vec3 direction;
- bool has_shadow;
-};
-
-layout(set = 0, binding = 3, std140) uniform Lights {
- Light data[MAX_LIGHTS];
-}
-lights;
-
-#endif // MODE COMPUTE LIGHT
-
-#ifdef MODE_SECOND_BOUNCE
-
-layout(set = 0, binding = 5) uniform texture3D color_texture;
-
-#ifdef MODE_ANISOTROPIC
-layout(set = 0, binding = 7) uniform texture3D aniso_pos_texture;
-layout(set = 0, binding = 8) uniform texture3D aniso_neg_texture;
-#endif // MODE ANISOTROPIC
-
-#endif // MODE_SECOND_BOUNCE
-
-#ifndef MODE_DYNAMIC
-
-layout(push_constant, binding = 0, std430) uniform Params {
- ivec3 limits;
- uint stack_size;
-
- float emission_scale;
- float propagation;
- float dynamic_range;
-
- uint light_count;
- uint cell_offset;
- uint cell_count;
- float aniso_strength;
- uint pad;
-}
-params;
-
-layout(set = 0, binding = 4, std430) buffer Outputs {
- vec4 data[];
-}
-outputs;
-
-#endif // MODE DYNAMIC
-
-layout(set = 0, binding = 9) uniform texture3D texture_sdf;
-layout(set = 0, binding = 10) uniform sampler texture_sampler;
-
-#ifdef MODE_WRITE_TEXTURE
-
-layout(rgba8, set = 0, binding = 5) uniform restrict writeonly image3D color_tex;
-
-#ifdef MODE_ANISOTROPIC
-
-layout(r16ui, set = 0, binding = 6) uniform restrict writeonly uimage3D aniso_pos_tex;
-layout(r16ui, set = 0, binding = 7) uniform restrict writeonly uimage3D aniso_neg_tex;
-
-#endif
-
-#endif
-
-#ifdef MODE_DYNAMIC
-
-layout(push_constant, binding = 0, std430) uniform Params {
- ivec3 limits;
- uint light_count; //when not lighting
- ivec3 x_dir;
- float z_base;
- ivec3 y_dir;
- float z_sign;
- ivec3 z_dir;
- float pos_multiplier;
- ivec2 rect_pos;
- ivec2 rect_size;
- ivec2 prev_rect_ofs;
- ivec2 prev_rect_size;
- bool flip_x;
- bool flip_y;
- float dynamic_range;
- bool on_mipmap;
- float propagation;
- float pad[3];
-}
-params;
-
-#ifdef MODE_DYNAMIC_LIGHTING
-
-layout(rgba8, set = 0, binding = 5) uniform restrict readonly image2D source_albedo;
-layout(rgba8, set = 0, binding = 6) uniform restrict readonly image2D source_normal;
-layout(rgba8, set = 0, binding = 7) uniform restrict readonly image2D source_orm;
-//layout (set=0,binding=8) uniform texture2D source_depth;
-layout(rgba16f, set = 0, binding = 11) uniform restrict image2D emission;
-layout(r32f, set = 0, binding = 12) uniform restrict image2D depth;
-
-#endif
-
-#ifdef MODE_DYNAMIC_SHRINK
-
-layout(rgba16f, set = 0, binding = 5) uniform restrict readonly image2D source_light;
-layout(r32f, set = 0, binding = 6) uniform restrict readonly image2D source_depth;
-
-#ifdef MODE_DYNAMIC_SHRINK_WRITE
-
-layout(rgba16f, set = 0, binding = 7) uniform restrict writeonly image2D light;
-layout(r32f, set = 0, binding = 8) uniform restrict writeonly image2D depth;
-
-#endif // MODE_DYNAMIC_SHRINK_WRITE
-
-#ifdef MODE_DYNAMIC_SHRINK_PLOT
-
-layout(rgba8, set = 0, binding = 11) uniform restrict image3D color_texture;
-
-#ifdef MODE_ANISOTROPIC
-
-layout(r16ui, set = 0, binding = 12) uniform restrict writeonly uimage3D aniso_pos_texture;
-layout(r16ui, set = 0, binding = 13) uniform restrict writeonly uimage3D aniso_neg_texture;
-
-#endif // MODE ANISOTROPIC
-
-#endif //MODE_DYNAMIC_SHRINK_PLOT
-
-#endif // MODE_DYNAMIC_SHRINK
-
-//layout (rgba8,set=0,binding=5) uniform restrict writeonly image3D color_tex;
-
-#endif // MODE DYNAMIC
-
-#if defined(MODE_COMPUTE_LIGHT) || defined(MODE_DYNAMIC_LIGHTING)
-
-float raymarch(float distance, float distance_adv, vec3 from, vec3 direction) {
-
- vec3 cell_size = 1.0 / vec3(params.limits);
- float occlusion = 1.0;
- while (distance > 0.5) { //use this to avoid precision errors
- float advance = texture(sampler3D(texture_sdf, texture_sampler), from * cell_size).r * 255.0 - 1.0;
- if (advance < 0.0) {
- occlusion = 0.0;
- break;
- }
-
- occlusion = min(advance, occlusion);
-
- advance = max(distance_adv, advance - mod(advance, distance_adv)); //should always advance in multiples of distance_adv
-
- from += direction * advance;
- distance -= advance;
- }
-
- return occlusion; //max(0.0,distance);
-}
-
-bool compute_light_vector(uint light, vec3 pos, out float attenuation, out vec3 light_pos) {
-
- if (lights.data[light].type == LIGHT_TYPE_DIRECTIONAL) {
-
- light_pos = pos - lights.data[light].direction * length(vec3(params.limits));
- attenuation = 1.0;
-
- } else {
-
- light_pos = lights.data[light].position;
- float distance = length(pos - light_pos);
- if (distance >= lights.data[light].radius) {
- return false;
- }
-
- attenuation = pow(clamp(1.0 - distance / lights.data[light].radius, 0.0001, 1.0), lights.data[light].attenuation);
-
- if (lights.data[light].type == LIGHT_TYPE_SPOT) {
-
- vec3 rel = normalize(pos - light_pos);
- float angle = acos(dot(rel, lights.data[light].direction));
- if (angle > lights.data[light].spot_angle_radians) {
- return false;
- }
-
- float d = clamp(angle / lights.data[light].spot_angle_radians, 0, 1);
- attenuation *= pow(1.0 - d, lights.data[light].spot_attenuation);
- }
- }
-
- return true;
-}
-
-float get_normal_advance(vec3 p_normal) {
-
- vec3 normal = p_normal;
- vec3 unorm = abs(normal);
-
- if ((unorm.x >= unorm.y) && (unorm.x >= unorm.z)) {
- // x code
- unorm = normal.x > 0.0 ? vec3(1.0, 0.0, 0.0) : vec3(-1.0, 0.0, 0.0);
- } else if ((unorm.y > unorm.x) && (unorm.y >= unorm.z)) {
- // y code
- unorm = normal.y > 0.0 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, -1.0, 0.0);
- } else if ((unorm.z > unorm.x) && (unorm.z > unorm.y)) {
- // z code
- unorm = normal.z > 0.0 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 0.0, -1.0);
- } else {
- // oh-no we messed up code
- // has to be
- unorm = vec3(1.0, 0.0, 0.0);
- }
-
- return 1.0 / dot(normal, unorm);
-}
-
-void clip_segment(vec4 plane, vec3 begin, inout vec3 end) {
-
- vec3 segment = begin - end;
- float den = dot(plane.xyz, segment);
-
- //printf("den is %i\n",den);
- if (den < 0.0001) {
- return;
- }
-
- float dist = (dot(plane.xyz, begin) - plane.w) / den;
-
- if (dist < 0.0001 || dist > 1.0001) {
- return;
- }
-
- end = begin + segment * -dist;
-}
-
-bool compute_light_at_pos(uint index, vec3 pos, vec3 normal, inout vec3 light, inout vec3 light_dir) {
- float attenuation;
- vec3 light_pos;
-
- if (!compute_light_vector(index, pos, attenuation, light_pos)) {
- return false;
- }
-
- light_dir = normalize(pos - light_pos);
-
- if (attenuation < 0.01 || (length(normal) > 0.2 && dot(normal, light_dir) >= 0)) {
- return false; //not facing the light, or attenuation is near zero
- }
-
- if (lights.data[index].has_shadow) {
-
- float distance_adv = get_normal_advance(light_dir);
-
- vec3 to = pos;
- if (length(normal) > 0.2) {
- to += normal * distance_adv * 0.51;
- } else {
- to -= sign(light_dir) * 0.45; //go near the edge towards the light direction to avoid self occlusion
- }
-
- //clip
- clip_segment(mix(vec4(-1.0, 0.0, 0.0, 0.0), vec4(1.0, 0.0, 0.0, float(params.limits.x - 1)), bvec4(light_dir.x < 0.0)), to, light_pos);
- clip_segment(mix(vec4(0.0, -1.0, 0.0, 0.0), vec4(0.0, 1.0, 0.0, float(params.limits.y - 1)), bvec4(light_dir.y < 0.0)), to, light_pos);
- clip_segment(mix(vec4(0.0, 0.0, -1.0, 0.0), vec4(0.0, 0.0, 1.0, float(params.limits.z - 1)), bvec4(light_dir.z < 0.0)), to, light_pos);
-
- float distance = length(to - light_pos);
- if (distance < 0.1) {
- return false; // hit
- }
-
- distance += distance_adv - mod(distance, distance_adv); //make it reach the center of the box always
- light_pos = to - light_dir * distance;
-
- //from -= sign(light_dir)*0.45; //go near the edge towards the light direction to avoid self occlusion
-
- /*float dist = raymarch(distance,distance_adv,light_pos,light_dir);
-
- if (dist > distance_adv) {
- return false;
- }
-
- attenuation *= 1.0 - smoothstep(0.1*distance_adv,distance_adv,dist);
- */
-
- float occlusion = raymarch(distance, distance_adv, light_pos, light_dir);
-
- if (occlusion == 0.0) {
- return false;
- }
-
- attenuation *= occlusion; //1.0 - smoothstep(0.1*distance_adv,distance_adv,dist);
- }
-
- light = lights.data[index].color * attenuation * lights.data[index].energy;
- return true;
-}
-
-#endif // MODE COMPUTE LIGHT
-
-void main() {
-
-#ifndef MODE_DYNAMIC
-
- uint cell_index = gl_GlobalInvocationID.x;
- if (cell_index >= params.cell_count) {
- return;
- }
- cell_index += params.cell_offset;
-
- uvec3 posu = uvec3(cell_data.data[cell_index].position & 0x7FF, (cell_data.data[cell_index].position >> 11) & 0x3FF, cell_data.data[cell_index].position >> 21);
- vec4 albedo = unpackUnorm4x8(cell_data.data[cell_index].albedo);
-
-#endif
-
- /////////////////COMPUTE LIGHT///////////////////////////////
-
-#ifdef MODE_COMPUTE_LIGHT
-
- vec3 pos = vec3(posu) + vec3(0.5);
-
- vec3 emission = vec3(uvec3(cell_data.data[cell_index].emission & 0x1ff, (cell_data.data[cell_index].emission >> 9) & 0x1ff, (cell_data.data[cell_index].emission >> 18) & 0x1ff)) * pow(2.0, float(cell_data.data[cell_index].emission >> 27) - 15.0 - 9.0);
- vec3 normal = unpackSnorm4x8(cell_data.data[cell_index].normal).xyz;
-
-#ifdef MODE_ANISOTROPIC
- vec3 accum[6] = vec3[](vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));
- const vec3 accum_dirs[6] = vec3[](vec3(1.0, 0.0, 0.0), vec3(-1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(0.0, 0.0, -1.0));
-#else
- vec3 accum = vec3(0.0);
-#endif
-
- for (uint i = 0; i < params.light_count; i++) {
-
- vec3 light;
- vec3 light_dir;
- if (!compute_light_at_pos(i, pos, normal.xyz, light, light_dir)) {
- continue;
- }
-
- light *= albedo.rgb;
-
-#ifdef MODE_ANISOTROPIC
- for (uint j = 0; j < 6; j++) {
-
- accum[j] += max(0.0, dot(accum_dirs[j], -light_dir)) * light;
- }
-#else
- if (length(normal) > 0.2) {
- accum += max(0.0, dot(normal, -light_dir)) * light;
- } else {
- //all directions
- accum += light;
- }
-#endif
- }
-
-#ifdef MODE_ANISOTROPIC
-
- for (uint i = 0; i < 6; i++) {
- vec3 light = accum[i];
- if (length(normal) > 0.2) {
- light += max(0.0, dot(accum_dirs[i], -normal)) * emission;
- } else {
- light += emission;
- }
-
- outputs.data[cell_index * 6 + i] = vec4(light, 0.0);
- }
-
-#else
- outputs.data[cell_index] = vec4(accum + emission, 0.0);
-
-#endif
-
-#endif //MODE_COMPUTE_LIGHT
-
- /////////////////SECOND BOUNCE///////////////////////////////
-
-#ifdef MODE_SECOND_BOUNCE
- vec3 pos = vec3(posu) + vec3(0.5);
- ivec3 ipos = ivec3(posu);
- vec4 normal = unpackSnorm4x8(cell_data.data[cell_index].normal);
-
-#ifdef MODE_ANISOTROPIC
- vec3 accum[6];
- const vec3 accum_dirs[6] = vec3[](vec3(1.0, 0.0, 0.0), vec3(-1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(0.0, 0.0, -1.0));
-
- /*vec3 src_color = texelFetch(sampler3D(color_texture,texture_sampler),ipos,0).rgb * params.dynamic_range;
- vec3 src_aniso_pos = texelFetch(sampler3D(aniso_pos_texture,texture_sampler),ipos,0).rgb;
- vec3 src_anisp_neg = texelFetch(sampler3D(anisp_neg_texture,texture_sampler),ipos,0).rgb;
- accum[0]=src_col * src_aniso_pos.x;
- accum[1]=src_col * src_aniso_neg.x;
- accum[2]=src_col * src_aniso_pos.y;
- accum[3]=src_col * src_aniso_neg.y;
- accum[4]=src_col * src_aniso_pos.z;
- accum[5]=src_col * src_aniso_neg.z;*/
-
- accum[0] = outputs.data[cell_index * 6 + 0].rgb;
- accum[1] = outputs.data[cell_index * 6 + 1].rgb;
- accum[2] = outputs.data[cell_index * 6 + 2].rgb;
- accum[3] = outputs.data[cell_index * 6 + 3].rgb;
- accum[4] = outputs.data[cell_index * 6 + 4].rgb;
- accum[5] = outputs.data[cell_index * 6 + 5].rgb;
-
-#else
- vec3 accum = outputs.data[cell_index].rgb;
-
-#endif
-
- if (length(normal.xyz) > 0.2) {
-
- vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);
- vec3 tangent = normalize(cross(v0, normal.xyz));
- vec3 bitangent = normalize(cross(tangent, normal.xyz));
- mat3 normal_mat = mat3(tangent, bitangent, normal.xyz);
-
-#define MAX_CONE_DIRS 6
-
- vec3 cone_dirs[MAX_CONE_DIRS] = vec3[](
- vec3(0.0, 0.0, 1.0),
- vec3(0.866025, 0.0, 0.5),
- vec3(0.267617, 0.823639, 0.5),
- vec3(-0.700629, 0.509037, 0.5),
- vec3(-0.700629, -0.509037, 0.5),
- vec3(0.267617, -0.823639, 0.5));
-
- float cone_weights[MAX_CONE_DIRS] = float[](0.25, 0.15, 0.15, 0.15, 0.15, 0.15);
- float tan_half_angle = 0.577;
-
- for (int i = 0; i < MAX_CONE_DIRS; i++) {
-
- vec3 direction = normal_mat * cone_dirs[i];
- vec4 color = vec4(0.0);
- {
-
- float dist = 1.5;
- float max_distance = length(vec3(params.limits));
- vec3 cell_size = 1.0 / vec3(params.limits);
-
-#ifdef MODE_ANISOTROPIC
- vec3 aniso_normal = mix(direction, normal.xyz, params.aniso_strength);
-#endif
- while (dist < max_distance && color.a < 0.95) {
- float diameter = max(1.0, 2.0 * tan_half_angle * dist);
- vec3 uvw_pos = (pos + dist * direction) * cell_size;
- float half_diameter = diameter * 0.5;
- //check if outside, then break
- //if ( any(greaterThan(abs(uvw_pos - 0.5),vec3(0.5f + half_diameter * cell_size)) ) ) {
- // break;
- //}
-
- float log2_diameter = log2(diameter);
- vec4 scolor = textureLod(sampler3D(color_texture, texture_sampler), uvw_pos, log2_diameter);
-#ifdef MODE_ANISOTROPIC
-
- vec3 aniso_neg = textureLod(sampler3D(aniso_neg_texture, texture_sampler), uvw_pos, log2_diameter).rgb;
- vec3 aniso_pos = textureLod(sampler3D(aniso_pos_texture, texture_sampler), uvw_pos, log2_diameter).rgb;
-
- scolor.rgb *= dot(max(vec3(0.0), (aniso_normal * aniso_pos)), vec3(1.0)) + dot(max(vec3(0.0), (-aniso_normal * aniso_neg)), vec3(1.0));
-#endif
- float a = (1.0 - color.a);
- color += a * scolor;
- dist += half_diameter;
- }
- }
- color *= cone_weights[i] * vec4(albedo.rgb, 1.0) * params.dynamic_range; //restore range
-#ifdef MODE_ANISOTROPIC
- for (uint j = 0; j < 6; j++) {
-
- accum[j] += max(0.0, dot(accum_dirs[j], direction)) * color.rgb;
- }
-#else
- accum += color.rgb;
-#endif
- }
- }
-
-#ifdef MODE_ANISOTROPIC
-
- outputs.data[cell_index * 6 + 0] = vec4(accum[0], 0.0);
- outputs.data[cell_index * 6 + 1] = vec4(accum[1], 0.0);
- outputs.data[cell_index * 6 + 2] = vec4(accum[2], 0.0);
- outputs.data[cell_index * 6 + 3] = vec4(accum[3], 0.0);
- outputs.data[cell_index * 6 + 4] = vec4(accum[4], 0.0);
- outputs.data[cell_index * 6 + 5] = vec4(accum[5], 0.0);
-#else
- outputs.data[cell_index] = vec4(accum, 0.0);
-
-#endif
-
-#endif // MODE_SECOND_BOUNCE
-
- /////////////////UPDATE MIPMAPS///////////////////////////////
-
-#ifdef MODE_UPDATE_MIPMAPS
-
- {
-#ifdef MODE_ANISOTROPIC
- vec3 light_accum[6] = vec3[](vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));
-#else
- vec3 light_accum = vec3(0.0);
-#endif
- float count = 0.0;
- for (uint i = 0; i < 8; i++) {
- uint child_index = cell_children.data[cell_index].children[i];
- if (child_index == NO_CHILDREN) {
- continue;
- }
-#ifdef MODE_ANISOTROPIC
- light_accum[0] += outputs.data[child_index * 6 + 0].rgb;
- light_accum[1] += outputs.data[child_index * 6 + 1].rgb;
- light_accum[2] += outputs.data[child_index * 6 + 2].rgb;
- light_accum[3] += outputs.data[child_index * 6 + 3].rgb;
- light_accum[4] += outputs.data[child_index * 6 + 4].rgb;
- light_accum[5] += outputs.data[child_index * 6 + 5].rgb;
-
-#else
- light_accum += outputs.data[child_index].rgb;
-
-#endif
-
- count += 1.0;
- }
-
- float divisor = mix(8.0, count, params.propagation);
-#ifdef MODE_ANISOTROPIC
- outputs.data[cell_index * 6 + 0] = vec4(light_accum[0] / divisor, 0.0);
- outputs.data[cell_index * 6 + 1] = vec4(light_accum[1] / divisor, 0.0);
- outputs.data[cell_index * 6 + 2] = vec4(light_accum[2] / divisor, 0.0);
- outputs.data[cell_index * 6 + 3] = vec4(light_accum[3] / divisor, 0.0);
- outputs.data[cell_index * 6 + 4] = vec4(light_accum[4] / divisor, 0.0);
- outputs.data[cell_index * 6 + 5] = vec4(light_accum[5] / divisor, 0.0);
-
-#else
- outputs.data[cell_index] = vec4(light_accum / divisor, 0.0);
-#endif
- }
-#endif
-
- ///////////////////WRITE TEXTURE/////////////////////////////
-
-#ifdef MODE_WRITE_TEXTURE
- {
-
-#ifdef MODE_ANISOTROPIC
- vec3 accum_total = vec3(0.0);
- accum_total += outputs.data[cell_index * 6 + 0].rgb;
- accum_total += outputs.data[cell_index * 6 + 1].rgb;
- accum_total += outputs.data[cell_index * 6 + 2].rgb;
- accum_total += outputs.data[cell_index * 6 + 3].rgb;
- accum_total += outputs.data[cell_index * 6 + 4].rgb;
- accum_total += outputs.data[cell_index * 6 + 5].rgb;
-
- float accum_total_energy = max(dot(accum_total, GREY_VEC), 0.00001);
- vec3 iso_positive = vec3(dot(outputs.data[cell_index * 6 + 0].rgb, GREY_VEC), dot(outputs.data[cell_index * 6 + 2].rgb, GREY_VEC), dot(outputs.data[cell_index * 6 + 4].rgb, GREY_VEC)) / vec3(accum_total_energy);
- vec3 iso_negative = vec3(dot(outputs.data[cell_index * 6 + 1].rgb, GREY_VEC), dot(outputs.data[cell_index * 6 + 3].rgb, GREY_VEC), dot(outputs.data[cell_index * 6 + 5].rgb, GREY_VEC)) / vec3(accum_total_energy);
-
- {
- uint aniso_pos = uint(clamp(iso_positive.b * 31.0, 0.0, 31.0));
- aniso_pos |= uint(clamp(iso_positive.g * 63.0, 0.0, 63.0)) << 5;
- aniso_pos |= uint(clamp(iso_positive.r * 31.0, 0.0, 31.0)) << 11;
- imageStore(aniso_pos_tex, ivec3(posu), uvec4(aniso_pos));
- }
-
- {
- uint aniso_neg = uint(clamp(iso_negative.b * 31.0, 0.0, 31.0));
- aniso_neg |= uint(clamp(iso_negative.g * 63.0, 0.0, 63.0)) << 5;
- aniso_neg |= uint(clamp(iso_negative.r * 31.0, 0.0, 31.0)) << 11;
- imageStore(aniso_neg_tex, ivec3(posu), uvec4(aniso_neg));
- }
-
- imageStore(color_tex, ivec3(posu), vec4(accum_total / params.dynamic_range, albedo.a));
-
-#else
-
- imageStore(color_tex, ivec3(posu), vec4(outputs.data[cell_index].rgb / params.dynamic_range, albedo.a));
-
-#endif
- }
-#endif
-
- ///////////////////DYNAMIC LIGHTING/////////////////////////////
-
-#ifdef MODE_DYNAMIC
-
- ivec2 pos_xy = ivec2(gl_GlobalInvocationID.xy);
- if (any(greaterThanEqual(pos_xy, params.rect_size))) {
- return; //out of bounds
- }
-
- ivec2 uv_xy = pos_xy;
- if (params.flip_x) {
- uv_xy.x = params.rect_size.x - pos_xy.x - 1;
- }
- if (params.flip_y) {
- uv_xy.y = params.rect_size.y - pos_xy.y - 1;
- }
-
-#ifdef MODE_DYNAMIC_LIGHTING
-
- {
- float z = params.z_base + imageLoad(depth, uv_xy).x * params.z_sign;
-
- ivec3 pos = params.x_dir * (params.rect_pos.x + pos_xy.x) + params.y_dir * (params.rect_pos.y + pos_xy.y) + abs(params.z_dir) * int(z);
-
- vec3 normal = imageLoad(source_normal, uv_xy).xyz * 2.0 - 1.0;
- normal = vec3(params.x_dir) * normal.x * mix(1.0, -1.0, params.flip_x) + vec3(params.y_dir) * normal.y * mix(1.0, -1.0, params.flip_y) - vec3(params.z_dir) * normal.z;
-
- vec4 albedo = imageLoad(source_albedo, uv_xy);
-
- //determine the position in space
-
- vec3 accum = vec3(0.0);
- for (uint i = 0; i < params.light_count; i++) {
-
- vec3 light;
- vec3 light_dir;
- if (!compute_light_at_pos(i, vec3(pos) * params.pos_multiplier, normal, light, light_dir)) {
- continue;
- }
-
- light *= albedo.rgb;
-
- accum += max(0.0, dot(normal, -light_dir)) * light;
- }
-
- accum += imageLoad(emission, uv_xy).xyz;
-
- imageStore(emission, uv_xy, vec4(accum, albedo.a));
- imageStore(depth, uv_xy, vec4(z));
- }
-
-#endif // MODE DYNAMIC LIGHTING
-
-#ifdef MODE_DYNAMIC_SHRINK
-
- {
- vec4 accum = vec4(0.0);
- float accum_z = 0.0;
- float count = 0.0;
-
- for (int i = 0; i < 4; i++) {
- ivec2 ofs = pos_xy * 2 + ivec2(i & 1, i >> 1) - params.prev_rect_ofs;
- if (any(lessThan(ofs, ivec2(0))) || any(greaterThanEqual(ofs, params.prev_rect_size))) {
- continue;
- }
- if (params.flip_x) {
- ofs.x = params.prev_rect_size.x - ofs.x - 1;
- }
- if (params.flip_y) {
- ofs.y = params.prev_rect_size.y - ofs.y - 1;
- }
-
- vec4 light = imageLoad(source_light, ofs);
- if (light.a == 0.0) { //ignore empty
- continue;
- }
- accum += light;
- float z = imageLoad(source_depth, ofs).x;
- accum_z += z * 0.5; //shrink half too
- count += 1.0;
- }
-
- if (params.on_mipmap) {
- accum.rgb /= mix(8.0, count, params.propagation);
- accum.a /= 8.0;
- } else {
- accum /= 4.0;
- }
-
- if (count == 0.0) {
- accum_z = 0.0; //avoid nan
- } else {
- accum_z /= count;
- }
-
-#ifdef MODE_DYNAMIC_SHRINK_WRITE
-
- imageStore(light, uv_xy, accum);
- imageStore(depth, uv_xy, vec4(accum_z));
-#endif
-
-#ifdef MODE_DYNAMIC_SHRINK_PLOT
-
- if (accum.a < 0.001) {
- return; //do not blit if alpha is too low
- }
-
- ivec3 pos = params.x_dir * (params.rect_pos.x + pos_xy.x) + params.y_dir * (params.rect_pos.y + pos_xy.y) + abs(params.z_dir) * int(accum_z);
-
- float z_frac = fract(accum_z);
-
- for (int i = 0; i < 2; i++) {
- ivec3 pos3d = pos + abs(params.z_dir) * i;
- if (any(lessThan(pos3d, ivec3(0))) || any(greaterThanEqual(pos3d, params.limits))) {
- //skip if offlimits
- continue;
- }
- vec4 color_blit = accum * (i == 0 ? 1.0 - z_frac : z_frac);
- vec4 color = imageLoad(color_texture, pos3d);
- color.rgb *= params.dynamic_range;
-
-#if 0
- color.rgb = mix(color.rgb,color_blit.rgb,color_blit.a);
- color.a+=color_blit.a;
-#else
-
- float sa = 1.0 - color_blit.a;
- vec4 result;
- result.a = color.a * sa + color_blit.a;
- if (result.a == 0.0) {
- result = vec4(0.0);
- } else {
- result.rgb = (color.rgb * color.a * sa + color_blit.rgb * color_blit.a) / result.a;
- color = result;
- }
-
-#endif
- color.rgb /= params.dynamic_range;
- imageStore(color_texture, pos3d, color);
- //imageStore(color_texture,pos3d,vec4(1,1,1,1));
-
-#ifdef MODE_ANISOTROPIC
- //do not care about anisotropy for dynamic objects, just store full lit in all directions
- imageStore(aniso_pos_texture, pos3d, uvec4(0xFFFF));
- imageStore(aniso_neg_texture, pos3d, uvec4(0xFFFF));
-
-#endif // ANISOTROPIC
- }
-#endif // MODE_DYNAMIC_SHRINK_PLOT
- }
-#endif
-
-#endif // MODE DYNAMIC
-}
diff --git a/servers/visual/rasterizer_rd/shaders/giprobe_debug.glsl b/servers/visual/rasterizer_rd/shaders/giprobe_debug.glsl
deleted file mode 100644
index b1784e7eee..0000000000
--- a/servers/visual/rasterizer_rd/shaders/giprobe_debug.glsl
+++ /dev/null
@@ -1,208 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-struct CellData {
- uint position; // xyz 10 bits
- uint albedo; //rgb albedo
- uint emission; //rgb normalized with e as multiplier
- uint normal; //RGB normal encoded
-};
-/* clang-format on */
-
-layout(set = 0, binding = 1, std140) buffer CellDataBuffer {
- CellData data[];
-}
-cell_data;
-
-layout(set = 0, binding = 2) uniform texture3D color_tex;
-
-layout(set = 0, binding = 3) uniform sampler tex_sampler;
-
-#ifdef USE_ANISOTROPY
-layout(set = 0, binding = 4) uniform texture3D aniso_pos_tex;
-layout(set = 0, binding = 5) uniform texture3D aniso_neg_tex;
-#endif
-
-layout(push_constant, binding = 0, std430) uniform Params {
-
- mat4 projection;
- uint cell_offset;
- float dynamic_range;
- float alpha;
- uint level;
- ivec3 bounds;
- uint pad;
-}
-params;
-
-layout(location = 0) out vec4 color_interp;
-
-void main() {
-
- const vec3 cube_triangles[36] = vec3[](
- vec3(-1.0f, -1.0f, -1.0f),
- vec3(-1.0f, -1.0f, 1.0f),
- vec3(-1.0f, 1.0f, 1.0f),
- vec3(1.0f, 1.0f, -1.0f),
- vec3(-1.0f, -1.0f, -1.0f),
- vec3(-1.0f, 1.0f, -1.0f),
- vec3(1.0f, -1.0f, 1.0f),
- vec3(-1.0f, -1.0f, -1.0f),
- vec3(1.0f, -1.0f, -1.0f),
- vec3(1.0f, 1.0f, -1.0f),
- vec3(1.0f, -1.0f, -1.0f),
- vec3(-1.0f, -1.0f, -1.0f),
- vec3(-1.0f, -1.0f, -1.0f),
- vec3(-1.0f, 1.0f, 1.0f),
- vec3(-1.0f, 1.0f, -1.0f),
- vec3(1.0f, -1.0f, 1.0f),
- vec3(-1.0f, -1.0f, 1.0f),
- vec3(-1.0f, -1.0f, -1.0f),
- vec3(-1.0f, 1.0f, 1.0f),
- vec3(-1.0f, -1.0f, 1.0f),
- vec3(1.0f, -1.0f, 1.0f),
- vec3(1.0f, 1.0f, 1.0f),
- vec3(1.0f, -1.0f, -1.0f),
- vec3(1.0f, 1.0f, -1.0f),
- vec3(1.0f, -1.0f, -1.0f),
- vec3(1.0f, 1.0f, 1.0f),
- vec3(1.0f, -1.0f, 1.0f),
- vec3(1.0f, 1.0f, 1.0f),
- vec3(1.0f, 1.0f, -1.0f),
- vec3(-1.0f, 1.0f, -1.0f),
- vec3(1.0f, 1.0f, 1.0f),
- vec3(-1.0f, 1.0f, -1.0f),
- vec3(-1.0f, 1.0f, 1.0f),
- vec3(1.0f, 1.0f, 1.0f),
- vec3(-1.0f, 1.0f, 1.0f),
- vec3(1.0f, -1.0f, 1.0f));
-
- vec3 vertex = cube_triangles[gl_VertexIndex] * 0.5 + 0.5;
-#ifdef MODE_DEBUG_LIGHT_FULL
- uvec3 posu = uvec3(gl_InstanceIndex % params.bounds.x, (gl_InstanceIndex / params.bounds.x) % params.bounds.y, gl_InstanceIndex / (params.bounds.y * params.bounds.x));
-#else
- uint cell_index = gl_InstanceIndex + params.cell_offset;
-
- uvec3 posu = uvec3(cell_data.data[cell_index].position & 0x7FF, (cell_data.data[cell_index].position >> 11) & 0x3FF, cell_data.data[cell_index].position >> 21);
-#endif
-
-#ifdef MODE_DEBUG_EMISSION
- color_interp.xyz = vec3(uvec3(cell_data.data[cell_index].emission & 0x1ff, (cell_data.data[cell_index].emission >> 9) & 0x1ff, (cell_data.data[cell_index].emission >> 18) & 0x1ff)) * pow(2.0, float(cell_data.data[cell_index].emission >> 27) - 15.0 - 9.0);
-#endif
-
-#ifdef MODE_DEBUG_COLOR
- color_interp.xyz = unpackUnorm4x8(cell_data.data[cell_index].albedo).xyz;
-#endif
-
-#ifdef MODE_DEBUG_LIGHT
-
-#ifdef USE_ANISOTROPY
-
-#define POS_X 0
-#define POS_Y 1
-#define POS_Z 2
-#define NEG_X 3
-#define NEG_Y 4
-#define NEG_Z 5
-
- const uint triangle_aniso[12] = uint[](
- NEG_X,
- NEG_Z,
- NEG_Y,
- NEG_Z,
- NEG_X,
- NEG_Y,
- POS_Z,
- POS_X,
- POS_X,
- POS_Y,
- POS_Y,
- POS_Z);
-
- color_interp.xyz = texelFetch(sampler3D(color_tex, tex_sampler), ivec3(posu), int(params.level)).xyz * params.dynamic_range;
- vec3 aniso_pos = texelFetch(sampler3D(aniso_pos_tex, tex_sampler), ivec3(posu), int(params.level)).xyz;
- vec3 aniso_neg = texelFetch(sampler3D(aniso_neg_tex, tex_sampler), ivec3(posu), int(params.level)).xyz;
- uint side = triangle_aniso[gl_VertexIndex / 3];
-
- float strength = 0.0;
- switch (side) {
- case POS_X: strength = aniso_pos.x; break;
- case POS_Y: strength = aniso_pos.y; break;
- case POS_Z: strength = aniso_pos.z; break;
- case NEG_X: strength = aniso_neg.x; break;
- case NEG_Y: strength = aniso_neg.y; break;
- case NEG_Z: strength = aniso_neg.z; break;
- }
-
- color_interp.xyz *= strength;
-
-#else
- color_interp = texelFetch(sampler3D(color_tex, tex_sampler), ivec3(posu), int(params.level));
- color_interp.xyz *params.dynamic_range;
-
-#endif
-
-#endif
- float scale = (1 << params.level);
-
- gl_Position = params.projection * vec4((vec3(posu) + vertex) * scale, 1.0);
-
-#ifdef MODE_DEBUG_LIGHT_FULL
- if (color_interp.a == 0.0) {
- gl_Position = vec4(0.0); //force clip and not draw
- }
-#else
- color_interp.a = params.alpha;
-#endif
-}
-
-/* clang-format off */
-[fragment]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(location = 0) in vec4 color_interp;
-/* clang-format on */
-layout(location = 0) out vec4 frag_color;
-
-void main() {
-
- frag_color = color_interp;
-
-#ifdef MODE_DEBUG_LIGHT_FULL
-
- //there really is no alpha, so use dither
-
- int x = int(gl_FragCoord.x) % 4;
- int y = int(gl_FragCoord.y) % 4;
- int index = x + y * 4;
- float limit = 0.0;
- if (x < 8) {
- if (index == 0) limit = 0.0625;
- if (index == 1) limit = 0.5625;
- if (index == 2) limit = 0.1875;
- if (index == 3) limit = 0.6875;
- if (index == 4) limit = 0.8125;
- if (index == 5) limit = 0.3125;
- if (index == 6) limit = 0.9375;
- if (index == 7) limit = 0.4375;
- if (index == 8) limit = 0.25;
- if (index == 9) limit = 0.75;
- if (index == 10) limit = 0.125;
- if (index == 11) limit = 0.625;
- if (index == 12) limit = 1.0;
- if (index == 13) limit = 0.5;
- if (index == 14) limit = 0.875;
- if (index == 15) limit = 0.375;
- }
- if (frag_color.a < limit) {
- discard;
- }
-#endif
-}
diff --git a/servers/visual/rasterizer_rd/shaders/giprobe_sdf.glsl b/servers/visual/rasterizer_rd/shaders/giprobe_sdf.glsl
deleted file mode 100644
index d089236723..0000000000
--- a/servers/visual/rasterizer_rd/shaders/giprobe_sdf.glsl
+++ /dev/null
@@ -1,187 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(local_size_x = 4, local_size_y = 4, local_size_z = 4) in;
-/* clang-format on */
-
-#define MAX_DISTANCE 100000
-
-#define NO_CHILDREN 0xFFFFFFFF
-#define GREY_VEC vec3(0.33333, 0.33333, 0.33333)
-
-struct CellChildren {
- uint children[8];
-};
-
-layout(set = 0, binding = 1, std430) buffer CellChildrenBuffer {
- CellChildren data[];
-}
-cell_children;
-
-struct CellData {
- uint position; // xyz 10 bits
- uint albedo; //rgb albedo
- uint emission; //rgb normalized with e as multiplier
- uint normal; //RGB normal encoded
-};
-
-layout(set = 0, binding = 2, std430) buffer CellDataBuffer {
- CellData data[];
-}
-cell_data;
-
-layout(r8ui, set = 0, binding = 3) uniform restrict writeonly uimage3D sdf_tex;
-
-layout(push_constant, binding = 0, std430) uniform Params {
- uint offset;
- uint end;
- uint pad0;
- uint pad1;
-}
-params;
-
-void main() {
-
- vec3 pos = vec3(gl_GlobalInvocationID);
- float closest_dist = 100000.0;
-
- for (uint i = params.offset; i < params.end; i++) {
- vec3 posu = vec3(uvec3(cell_data.data[i].position & 0x7FF, (cell_data.data[i].position >> 11) & 0x3FF, cell_data.data[i].position >> 21));
- float dist = length(pos - posu);
- if (dist < closest_dist) {
- closest_dist = dist;
- }
- }
-
- uint dist_8;
-
- if (closest_dist < 0.0001) { // same cell
- dist_8 = 0; //equals to -1
- } else {
- dist_8 = clamp(uint(closest_dist), 0, 254) + 1; //conservative, 0 is 1, so <1 is considered solid
- }
-
- imageStore(sdf_tex, ivec3(gl_GlobalInvocationID), uvec4(dist_8));
- //imageStore(sdf_tex,pos,uvec4(pos*2,0));
-}
-
-#if 0
-layout(push_constant, binding = 0, std430) uniform Params {
-
- ivec3 limits;
- uint stack_size;
-} params;
-
-float distance_to_aabb(ivec3 pos, ivec3 aabb_pos, ivec3 aabb_size) {
-
- vec3 delta = vec3(max(ivec3(0), max(aabb_pos - pos, pos - (aabb_pos + aabb_size - ivec3(1)))));
- return length(delta);
-}
-
-void main() {
-
- ivec3 pos = ivec3(gl_GlobalInvocationID);
-
- uint stack[10] = uint[](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- uint stack_indices[10] = uint[](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- ivec3 stack_positions[10] = ivec3[](ivec3(0), ivec3(0), ivec3(0), ivec3(0), ivec3(0), ivec3(0), ivec3(0), ivec3(0), ivec3(0), ivec3(0));
-
- const uint cell_orders[8] = uint[](
- 0x11f58d1,
- 0xe2e70a,
- 0xd47463,
- 0xbb829c,
- 0x8d11f5,
- 0x70ae2e,
- 0x463d47,
- 0x29cbb8);
-
- bool cell_found = false;
- bool cell_found_exact = false;
- ivec3 closest_cell_pos;
- float closest_distance = MAX_DISTANCE;
- int stack_pos = 0;
-
- while (true) {
-
- uint index = stack_indices[stack_pos] >> 24;
-
- if (index == 8) {
- //go up
- if (stack_pos == 0) {
- break; //done going through octree
- }
- stack_pos--;
- continue;
- }
-
- stack_indices[stack_pos] = (stack_indices[stack_pos] & ((1 << 24) - 1)) | ((index + 1) << 24);
-
- uint cell_index = (stack_indices[stack_pos] >> (index * 3)) & 0x7;
- uint child_cell = cell_children.data[stack[stack_pos]].children[cell_index];
-
- if (child_cell == NO_CHILDREN) {
- continue;
- }
-
- ivec3 child_cell_size = params.limits >> (stack_pos + 1);
- ivec3 child_cell_pos = stack_positions[stack_pos];
-
- child_cell_pos += mix(ivec3(0), child_cell_size, bvec3(uvec3(index & 1, index & 2, index & 4) != uvec3(0)));
-
- bool is_leaf = stack_pos == (params.stack_size - 2);
-
- if (child_cell_pos == pos && is_leaf) {
- //we may actually end up in the exact cell.
- //if this happens, just abort
- cell_found_exact = true;
- break;
- }
-
- if (cell_found) {
- //discard by distance
- float distance = distance_to_aabb(pos, child_cell_pos, child_cell_size);
- if (distance >= closest_distance) {
- continue; //pointless, just test next child
- } else if (is_leaf) {
- //closer than what we have AND end of stack, save and continue
- closest_cell_pos = child_cell_pos;
- closest_distance = distance;
- continue;
- }
- } else if (is_leaf) {
- //first solid cell we find, save and continue
- closest_distance = distance_to_aabb(pos, child_cell_pos, child_cell_size);
- closest_cell_pos = child_cell_pos;
- cell_found = true;
- continue;
- }
-
- bvec3 direction = greaterThan((pos - (child_cell_pos + (child_cell_size >> 1))), ivec3(0));
- uint cell_order = 0;
- cell_order |= mix(0, 1, direction.x);
- cell_order |= mix(0, 2, direction.y);
- cell_order |= mix(0, 4, direction.z);
-
- stack[stack_pos + 1] = child_cell;
- stack_indices[stack_pos + 1] = cell_orders[cell_order]; //start counting
- stack_positions[stack_pos + 1] = child_cell_pos;
- stack_pos++; //go up stack
- }
-
- uint dist_8;
-
- if (cell_found_exact) {
- dist_8 = 0; //equals to -1
- } else {
- float closest_distance = length(vec3(pos - closest_cell_pos));
- dist_8 = clamp(uint(closest_distance), 0, 254) + 1; //conservative, 0 is 1, so <1 is considered solid
- }
-
- imageStore(sdf_tex, pos, uvec4(dist_8));
-}
-#endif
diff --git a/servers/visual/rasterizer_rd/shaders/giprobe_write.glsl b/servers/visual/rasterizer_rd/shaders/giprobe_write.glsl
deleted file mode 100644
index c832223b1e..0000000000
--- a/servers/visual/rasterizer_rd/shaders/giprobe_write.glsl
+++ /dev/null
@@ -1,335 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
-/* clang-format on */
-
-#define NO_CHILDREN 0xFFFFFFFF
-#define GREY_VEC vec3(0.33333, 0.33333, 0.33333)
-
-struct CellChildren {
- uint children[8];
-};
-
-layout(set = 0, binding = 1, std430) buffer CellChildrenBuffer {
- CellChildren data[];
-}
-cell_children;
-
-struct CellData {
- uint position; // xyz 10 bits
- uint albedo; //rgb albedo
- uint emission; //rgb normalized with e as multiplier
- uint normal; //RGB normal encoded
-};
-
-layout(set = 0, binding = 2, std430) buffer CellDataBuffer {
- CellData data[];
-}
-cell_data;
-
-#define LIGHT_TYPE_DIRECTIONAL 0
-#define LIGHT_TYPE_OMNI 1
-#define LIGHT_TYPE_SPOT 2
-
-#ifdef MODE_COMPUTE_LIGHT
-
-struct Light {
- uint type;
- float energy;
- float radius;
- float attenuation;
-
- vec3 color;
- float spot_angle_radians;
-
- vec3 position;
- float spot_attenuation;
-
- vec3 direction;
- bool has_shadow;
-};
-
-layout(set = 0, binding = 3, std140) uniform Lights {
- Light data[MAX_LIGHTS];
-}
-lights;
-
-#endif
-
-layout(push_constant, binding = 0, std430) uniform Params {
- ivec3 limits;
- uint stack_size;
-
- float emission_scale;
- float propagation;
- float dynamic_range;
-
- uint light_count;
- uint cell_offset;
- uint cell_count;
- uint pad[2];
-}
-params;
-
-layout(set = 0, binding = 4, std140) uniform Outputs {
- vec4 data[];
-}
-output;
-
-#ifdef MODE_COMPUTE_LIGHT
-
-uint raymarch(float distance, float distance_adv, vec3 from, vec3 direction) {
-
- uint result = NO_CHILDREN;
-
- ivec3 size = ivec3(max(max(params.limits.x, params.limits.y), params.limits.z));
-
- while (distance > -distance_adv) { //use this to avoid precision errors
-
- uint cell = 0;
-
- ivec3 pos = ivec3(from);
-
- if (all(greaterThanEqual(pos, ivec3(0))) && all(lessThan(pos, size))) {
-
- ivec3 ofs = ivec3(0);
- ivec3 half_size = size / 2;
-
- for (int i = 0; i < params.stack_size - 1; i++) {
-
- bvec3 greater = greaterThanEqual(pos, ofs + half_size);
-
- ofs += mix(ivec3(0), half_size, greater);
-
- uint child = 0; //wonder if this can be done faster
- if (greater.x) {
- child |= 1;
- }
- if (greater.y) {
- child |= 2;
- }
- if (greater.z) {
- child |= 4;
- }
-
- cell = cell_children.data[cell].children[child];
- if (cell == NO_CHILDREN)
- break;
-
- half_size >>= ivec3(1);
- }
-
- if (cell != NO_CHILDREN) {
- return cell; //found cell!
- }
- }
-
- from += direction * distance_adv;
- distance -= distance_adv;
- }
-
- return NO_CHILDREN;
-}
-
-bool compute_light_vector(uint light, uint cell, vec3 pos, out float attenuation, out vec3 light_pos) {
-
- if (lights.data[light].type == LIGHT_TYPE_DIRECTIONAL) {
-
- light_pos = pos - lights.data[light].direction * length(vec3(params.limits));
- attenuation = 1.0;
-
- } else {
-
- light_pos = lights.data[light].position;
- float distance = length(pos - light_pos);
- if (distance >= lights.data[light].radius) {
- return false;
- }
-
- attenuation = pow(clamp(1.0 - distance / lights.data[light].radius, 0.0001, 1.0), lights.data[light].attenuation);
-
- if (lights.data[light].type == LIGHT_TYPE_SPOT) {
-
- vec3 rel = normalize(pos - light_pos);
- float angle = acos(dot(rel, lights.data[light].direction));
- if (angle > lights.data[light].spot_angle_radians) {
- return false;
- }
-
- float d = clamp(angle / lights.data[light].spot_angle_radians, 0, 1);
- attenuation *= pow(1.0 - d, lights.data[light].spot_attenuation);
- }
- }
-
- return true;
-}
-
-float get_normal_advance(vec3 p_normal) {
-
- vec3 normal = p_normal;
- vec3 unorm = abs(normal);
-
- if ((unorm.x >= unorm.y) && (unorm.x >= unorm.z)) {
- // x code
- unorm = normal.x > 0.0 ? vec3(1.0, 0.0, 0.0) : vec3(-1.0, 0.0, 0.0);
- } else if ((unorm.y > unorm.x) && (unorm.y >= unorm.z)) {
- // y code
- unorm = normal.y > 0.0 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, -1.0, 0.0);
- } else if ((unorm.z > unorm.x) && (unorm.z > unorm.y)) {
- // z code
- unorm = normal.z > 0.0 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 0.0, -1.0);
- } else {
- // oh-no we messed up code
- // has to be
- unorm = vec3(1.0, 0.0, 0.0);
- }
-
- return 1.0 / dot(normal, unorm);
-}
-
-#endif
-
-void main() {
-
- uint cell_index = gl_GlobalInvocationID.x;
- if (cell_index >= params.cell_count) {
- return;
- }
- cell_index += params.cell_offset;
-
- uvec3 posu = uvec3(cell_data.data[cell_index].position & 0x7FF, (cell_data.data[cell_index].position >> 11) & 0x3FF, cell_data.data[cell_index].position >> 21);
- vec4 albedo = unpackUnorm4x8(cell_data.data[cell_index].albedo);
-
-#ifdef MODE_COMPUTE_LIGHT
-
- vec3 pos = vec3(posu) + vec3(0.5);
-
- vec3 emission = vec3(ivec3(cell_data.data[cell_index].emission & 0x3FF, (cell_data.data[cell_index].emission >> 10) & 0x7FF, cell_data.data[cell_index].emission >> 21)) * params.emission_scale;
- vec4 normal = unpackSnorm4x8(cell_data.data[cell_index].normal);
-
-#ifdef MODE_ANISOTROPIC
- vec3 accum[6] = vec3[](vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));
- const vec3 accum_dirs[6] = vec3[](vec3(1.0, 0.0, 0.0), vec3(-1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(0.0, 0.0, -1.0));
-#else
- vec3 accum = vec3(0.0);
-#endif
-
- for (uint i = 0; i < params.light_count; i++) {
-
- float attenuation;
- vec3 light_pos;
-
- if (!compute_light_vector(i, cell_index, pos, attenuation, light_pos)) {
- continue;
- }
-
- vec3 light_dir = pos - light_pos;
- float distance = length(light_dir);
- light_dir = normalize(light_dir);
-
- if (length(normal.xyz) > 0.2 && dot(normal.xyz, light_dir) >= 0) {
- continue; //not facing the light
- }
-
- if (lights.data[i].has_shadow) {
-
- float distance_adv = get_normal_advance(light_dir);
-
- distance += distance_adv - mod(distance, distance_adv); //make it reach the center of the box always
-
- vec3 from = pos - light_dir * distance; //approximate
- from -= sign(light_dir) * 0.45; //go near the edge towards the light direction to avoid self occlusion
-
- uint result = raymarch(distance, distance_adv, from, light_dir);
-
- if (result != cell_index) {
- continue; //was occluded
- }
- }
-
- vec3 light = lights.data[i].color * albedo.rgb * attenuation * lights.data[i].energy;
-
-#ifdef MODE_ANISOTROPIC
- for (uint j = 0; j < 6; j++) {
- accum[j] += max(0.0, dot(accum_dir, -light_dir)) * light + emission;
- }
-#else
- if (length(normal.xyz) > 0.2) {
- accum += max(0.0, dot(normal.xyz, -light_dir)) * light + emission;
- } else {
- //all directions
- accum += light + emission;
- }
-#endif
- }
-
-#ifdef MODE_ANISOTROPIC
-
- output.data[cell_index * 6 + 0] = vec4(accum[0], 0.0);
- output.data[cell_index * 6 + 1] = vec4(accum[1], 0.0);
- output.data[cell_index * 6 + 2] = vec4(accum[2], 0.0);
- output.data[cell_index * 6 + 3] = vec4(accum[3], 0.0);
- output.data[cell_index * 6 + 4] = vec4(accum[4], 0.0);
- output.data[cell_index * 6 + 5] = vec4(accum[5], 0.0);
-#else
- output.data[cell_index] = vec4(accum, 0.0);
-
-#endif
-
-#endif //MODE_COMPUTE_LIGHT
-
-#ifdef MODE_UPDATE_MIPMAPS
-
- {
-#ifdef MODE_ANISOTROPIC
- vec3 light_accum[6] = vec3[](vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));
-#else
- vec3 light_accum = vec3(0.0);
-#endif
- float count = 0.0;
- for (uint i = 0; i < 8; i++) {
- uint child_index = cell_children.data[cell_index].children[i];
- if (child_index == NO_CHILDREN) {
- continue;
- }
-#ifdef MODE_ANISOTROPIC
- light_accum[1] += output.data[child_index * 6 + 0].rgb;
- light_accum[2] += output.data[child_index * 6 + 1].rgb;
- light_accum[3] += output.data[child_index * 6 + 2].rgb;
- light_accum[4] += output.data[child_index * 6 + 3].rgb;
- light_accum[5] += output.data[child_index * 6 + 4].rgb;
- light_accum[6] += output.data[child_index * 6 + 5].rgb;
-
-#else
- light_accum += output.data[child_index].rgb;
-
-#endif
-
- count += 1.0;
- }
-
- float divisor = mix(8.0, count, params.propagation);
-#ifdef MODE_ANISOTROPIC
- output.data[cell_index * 6 + 0] = vec4(light_accum[0] / divisor, 0.0);
- output.data[cell_index * 6 + 1] = vec4(light_accum[1] / divisor, 0.0);
- output.data[cell_index * 6 + 2] = vec4(light_accum[2] / divisor, 0.0);
- output.data[cell_index * 6 + 3] = vec4(light_accum[3] / divisor, 0.0);
- output.data[cell_index * 6 + 4] = vec4(light_accum[4] / divisor, 0.0);
- output.data[cell_index * 6 + 5] = vec4(light_accum[5] / divisor, 0.0);
-
-#else
- output.data[cell_index] = vec4(light_accum / divisor, 0.0);
-#endif
- }
-#endif
-
-#ifdef MODE_WRITE_TEXTURE
- {
- }
-#endif
-}
diff --git a/servers/visual/rasterizer_rd/shaders/luminance_reduce.glsl b/servers/visual/rasterizer_rd/shaders/luminance_reduce.glsl
deleted file mode 100644
index 4bf5b7e7f1..0000000000
--- a/servers/visual/rasterizer_rd/shaders/luminance_reduce.glsl
+++ /dev/null
@@ -1,87 +0,0 @@
-/* clang-format off */
-[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;
-/* clang-format on */
-
-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, binding = 1, 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/visual/rasterizer_rd/shaders/roughness_limiter.glsl b/servers/visual/rasterizer_rd/shaders/roughness_limiter.glsl
deleted file mode 100644
index 3637b1abb2..0000000000
--- a/servers/visual/rasterizer_rd/shaders/roughness_limiter.glsl
+++ /dev/null
@@ -1,73 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-/* clang-format on */
-
-layout(set = 0, binding = 0) uniform sampler2D source_normal;
-layout(r8, set = 1, binding = 0) uniform restrict writeonly image2D dest_roughness;
-
-layout(push_constant, binding = 1, std430) uniform Params {
- ivec2 screen_size;
- float curve;
- uint pad;
-}
-params;
-
-#define HALF_PI 1.5707963267948966
-
-void main() {
-
- // Pixel being shaded
- ivec2 pos = ivec2(gl_GlobalInvocationID.xy);
- if (any(greaterThan(pos, params.screen_size))) { //too large, do nothing
- return;
- }
-
- vec3 normal_accum = vec3(0.0);
- float accum = 0.0;
- for (int i = 0; i <= 1; i++) {
- for (int j = 0; j <= 1; j++) {
- normal_accum += normalize(texelFetch(source_normal, pos + ivec2(i, j), 0).xyz * 2.0 - 1.0);
- accum += 1.0;
- }
- }
-
- normal_accum /= accum;
-
- float r = length(normal_accum);
-
- float limit;
-
- if (r < 1.0) {
- float threshold = 0.4;
-
- /*
- //Formula from Filament, does not make sense to me.
-
- float r2 = r * r;
- float kappa = (3.0f * r - r * r2) / (1.0f - r2);
- float variance = 0.25f / kappa;
- limit = sqrt(min(2.0f * variance, threshold * threshold));
-//*/
- /*
- //Formula based on probability distribution graph
-
- float width = acos(max(0.0,r)); // convert to angle (width)
- float roughness = pow(width,1.7)*0.854492; //approximate (crappy) formula to convert to roughness
- limit = min(sqrt(roughness), threshold); //convert to perceptual roughness and apply threshold
-//*/
-
- limit = min(sqrt(pow(acos(max(0.0, r)) / HALF_PI, params.curve)), threshold); //convert to perceptual roughness and apply threshold
-
- //limit = 0.5;
- } else {
- limit = 0.0;
- }
-
- imageStore(dest_roughness, pos, vec4(limit));
-}
diff --git a/servers/visual/rasterizer_rd/shaders/scene_high_end.glsl b/servers/visual/rasterizer_rd/shaders/scene_high_end.glsl
deleted file mode 100644
index 07f4770b14..0000000000
--- a/servers/visual/rasterizer_rd/shaders/scene_high_end.glsl
+++ /dev/null
@@ -1,1718 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-#include "scene_high_end_inc.glsl"
-
-/* INPUT ATTRIBS */
-
-layout(location = 0) in vec3 vertex_attrib;
-/* clang-format on */
-layout(location = 1) in vec3 normal_attrib;
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-layout(location = 2) in vec4 tangent_attrib;
-#endif
-
-#if defined(COLOR_USED)
-layout(location = 3) in vec4 color_attrib;
-#endif
-
-#if defined(UV_USED)
-layout(location = 4) in vec2 uv_attrib;
-#endif
-
-#if defined(UV2_USED) || defined(USE_LIGHTMAP)
-layout(location = 5) in vec2 uv2_attrib;
-#endif
-
-layout(location = 6) in uvec4 bone_attrib; // always bound, even if unused
-
-/* Varyings */
-
-layout(location = 0) out vec3 vertex_interp;
-layout(location = 1) out vec3 normal_interp;
-
-#if defined(COLOR_USED)
-layout(location = 2) out vec4 color_interp;
-#endif
-
-#if defined(UV_USED)
-layout(location = 3) out vec2 uv_interp;
-#endif
-
-#if defined(UV2_USED) || defined(USE_LIGHTMAP)
-layout(location = 4) out vec2 uv2_interp;
-#endif
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-layout(location = 5) out vec3 tangent_interp;
-layout(location = 6) out vec3 binormal_interp;
-#endif
-
-#ifdef USE_MATERIAL_UNIFORMS
-layout(set = 5, binding = 0, std140) uniform MaterialUniforms{
- /* clang-format off */
-MATERIAL_UNIFORMS
- /* clang-format on */
-} material;
-#endif
-
-/* clang-format off */
-
-VERTEX_SHADER_GLOBALS
-
-/* clang-format on */
-
-// FIXME: This triggers a Mesa bug that breaks rendering, so disabled for now.
-// See GH-13450 and https://bugs.freedesktop.org/show_bug.cgi?id=100316
-invariant gl_Position;
-
-layout(location = 7) flat out uint instance_index;
-
-#ifdef MODE_DUAL_PARABOLOID
-
-layout(location = 8) out float dp_clip;
-
-#endif
-
-void main() {
-
- instance_index = draw_call.instance_index;
- vec4 instance_custom = vec4(0.0);
-#if defined(COLOR_USED)
- color_interp = color_attrib;
-#endif
-
- mat4 world_matrix = instances.data[instance_index].transform;
- mat3 world_normal_matrix = mat3(instances.data[instance_index].normal_transform);
-
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_MULTIMESH)) {
- //multimesh, instances are for it
- uint offset = (instances.data[instance_index].flags >> INSTANCE_FLAGS_MULTIMESH_STRIDE_SHIFT) & INSTANCE_FLAGS_MULTIMESH_STRIDE_MASK;
- offset *= gl_InstanceIndex;
-
- mat4 matrix;
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_MULTIMESH_FORMAT_2D)) {
- matrix = mat4(transforms.data[offset + 0], transforms.data[offset + 1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
- offset += 2;
- } else {
- matrix = mat4(transforms.data[offset + 0], transforms.data[offset + 1], transforms.data[offset + 2], vec4(0.0, 0.0, 0.0, 1.0));
- offset += 3;
- }
-
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_MULTIMESH_HAS_COLOR)) {
-#ifdef COLOR_USED
- color_interp *= transforms.data[offset];
-#endif
- offset += 1;
- }
-
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_MULTIMESH_HAS_CUSTOM_DATA)) {
- instance_custom = transforms.data[offset];
- }
-
- //transpose
- matrix = transpose(matrix);
- world_matrix = world_matrix * matrix;
- world_normal_matrix = world_normal_matrix * mat3(matrix);
-
- } else {
- //not a multimesh, instances are for multiple draw calls
- instance_index += gl_InstanceIndex;
- }
-
- vec3 vertex = vertex_attrib;
- vec3 normal = normal_attrib;
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
- vec3 tangent = tangent_attrib.xyz;
- float binormalf = tangent_attrib.a;
- vec3 binormal = normalize(cross(normal, tangent) * binormalf);
-#endif
-
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_SKELETON)) {
- //multimesh, instances are for it
-
- uvec2 bones_01 = uvec2(bone_attrib.x & 0xFFFF, bone_attrib.x >> 16) * 3;
- uvec2 bones_23 = uvec2(bone_attrib.y & 0xFFFF, bone_attrib.y >> 16) * 3;
- vec2 weights_01 = unpackUnorm2x16(bone_attrib.z);
- vec2 weights_23 = unpackUnorm2x16(bone_attrib.w);
-
- mat4 m = mat4(transforms.data[bones_01.x], transforms.data[bones_01.x + 1], transforms.data[bones_01.x + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_01.x;
- m += mat4(transforms.data[bones_01.y], transforms.data[bones_01.y + 1], transforms.data[bones_01.y + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_01.y;
- m += mat4(transforms.data[bones_23.x], transforms.data[bones_23.x + 1], transforms.data[bones_23.x + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_23.x;
- m += mat4(transforms.data[bones_23.y], transforms.data[bones_23.y + 1], transforms.data[bones_23.y + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_23.y;
-
- //reverse order because its transposed
- vertex = (vec4(vertex, 1.0) * m).xyz;
- normal = (vec4(normal, 0.0) * m).xyz;
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-
- tangent = (vec4(tangent, 0.0) * m).xyz;
- binormal = (vec4(binormal, 0.0) * m).xyz;
-#endif
- }
-
-#if defined(UV_USED)
- uv_interp = uv_attrib;
-#endif
-
-#if defined(UV2_USED) || defined(USE_LIGHTMAP)
- uv2_interp = uv2_attrib;
-#endif
-
-#ifdef USE_OVERRIDE_POSITION
- vec4 position;
-#endif
-
- mat4 projection_matrix = scene_data.projection_matrix;
-
-//using world coordinates
-#if !defined(SKIP_TRANSFORM_USED) && defined(VERTEX_WORLD_COORDS_USED)
-
- vertex = (world_matrix * vec4(vertex, 1.0)).xyz;
-
- normal = world_normal_matrix * normal;
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-
- tangent = world_normal_matrix * tangent;
- binormal = world_normal_matrix * binormal;
-
-#endif
-#endif
-
- float roughness = 1.0;
-
- mat4 modelview = scene_data.inv_camera_matrix * world_matrix;
- mat3 modelview_normal = mat3(scene_data.inv_camera_matrix) * world_normal_matrix;
-
- {
- /* clang-format off */
-
-VERTEX_SHADER_CODE
-
- /* clang-format on */
- }
-
-// using local coordinates (default)
-#if !defined(SKIP_TRANSFORM_USED) && !defined(VERTEX_WORLD_COORDS_USED)
-
- vertex = (modelview * vec4(vertex, 1.0)).xyz;
- normal = modelview_normal * normal;
-#endif
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-
- binormal = modelview_normal * binormal;
- tangent = modelview_normal * tangent;
-#endif
-
-//using world coordinates
-#if !defined(SKIP_TRANSFORM_USED) && defined(VERTEX_WORLD_COORDS_USED)
-
- vertex = (scene_data.inv_camera_matrix * vec4(vertex, 1.0)).xyz;
- normal = mat3(scene_data.inverse_normal_matrix) * normal;
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-
- binormal = mat3(scene_data.camera_inverse_binormal_matrix) * binormal;
- tangent = mat3(scene_data.camera_inverse_tangent_matrix) * tangent;
-#endif
-#endif
-
- vertex_interp = vertex;
- normal_interp = normal;
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
- tangent_interp = tangent;
- binormal_interp = binormal;
-#endif
-
-#ifdef MODE_RENDER_DEPTH
-
-#ifdef MODE_DUAL_PARABOLOID
-
- vertex_interp.z *= scene_data.dual_paraboloid_side;
- normal_interp.z *= scene_data.dual_paraboloid_side;
-
- dp_clip = vertex_interp.z; //this attempts to avoid noise caused by objects sent to the other parabolloid side due to bias
-
- //for dual paraboloid shadow mapping, this is the fastest but least correct way, as it curves straight edges
-
- vec3 vtx = vertex_interp + normalize(vertex_interp) * scene_data.z_offset;
- float distance = length(vtx);
- vtx = normalize(vtx);
- vtx.xy /= 1.0 - vtx.z;
- vtx.z = (distance / scene_data.z_far);
- vtx.z = vtx.z * 2.0 - 1.0;
-
- vertex_interp = vtx;
-#else
-
- float z_ofs = scene_data.z_offset;
- z_ofs += max(0.0, 1.0 - abs(normalize(normal_interp).z)) * scene_data.z_slope_scale;
- vertex_interp.z -= z_ofs;
-
-#endif
-
-#endif //MODE_RENDER_DEPTH
-
-#ifdef USE_OVERRIDE_POSITION
- gl_Position = position;
-#else
- gl_Position = projection_matrix * vec4(vertex_interp, 1.0);
-#endif
-}
-
-/* clang-format off */
-[fragment]
-
-#version 450
-
-VERSION_DEFINES
-
-#include "scene_high_end_inc.glsl"
-
-/* Varyings */
-
-layout(location = 0) in vec3 vertex_interp;
-/* clang-format on */
-layout(location = 1) in vec3 normal_interp;
-
-#if defined(COLOR_USED)
-layout(location = 2) in vec4 color_interp;
-#endif
-
-#if defined(UV_USED)
-layout(location = 3) in vec2 uv_interp;
-#endif
-
-#if defined(UV2_USED) || defined(USE_LIGHTMAP)
-layout(location = 4) in vec2 uv2_interp;
-#endif
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
-layout(location = 5) in vec3 tangent_interp;
-layout(location = 6) in vec3 binormal_interp;
-#endif
-
-layout(location = 7) flat in uint instance_index;
-
-#ifdef MODE_DUAL_PARABOLOID
-
-layout(location = 8) in float dp_clip;
-
-#endif
-
-//defines to keep compatibility with vertex
-
-#define world_matrix instances.data[instance_index].transform
-#define world_normal_matrix instances.data[instance_index].normal_transform
-#define projection_matrix scene_data.projection_matrix
-
-#ifdef USE_MATERIAL_UNIFORMS
-layout(set = 5, binding = 0, std140) uniform MaterialUniforms{
- /* clang-format off */
-MATERIAL_UNIFORMS
- /* clang-format on */
-} material;
-#endif
-
-/* clang-format off */
-
-FRAGMENT_SHADER_GLOBALS
-
-/* clang-format on */
-
-#ifdef MODE_RENDER_DEPTH
-
-#ifdef MODE_RENDER_MATERIAL
-
-layout(location = 0) out vec4 albedo_output_buffer;
-layout(location = 1) out vec4 normal_output_buffer;
-layout(location = 2) out vec4 orm_output_buffer;
-layout(location = 3) out vec4 emission_output_buffer;
-layout(location = 4) out float depth_output_buffer;
-
-#endif
-
-#ifdef MODE_RENDER_NORMAL
-layout(location = 0) out vec4 normal_output_buffer;
-#ifdef MODE_RENDER_ROUGHNESS
-layout(location = 1) out float roughness_output_buffer;
-#endif //MODE_RENDER_ROUGHNESS
-#endif //MODE_RENDER_NORMAL
-#else // RENDER DEPTH
-
-#ifdef MODE_MULTIPLE_RENDER_TARGETS
-
-layout(location = 0) out vec4 diffuse_buffer; //diffuse (rgb) and roughness
-layout(location = 1) out vec4 specular_buffer; //specular and SSS (subsurface scatter)
-#else
-
-layout(location = 0) out vec4 frag_color;
-#endif
-
-#endif // RENDER DEPTH
-
-// This returns the G_GGX function divided by 2 cos_theta_m, where in practice cos_theta_m is either N.L or N.V.
-// We're dividing this factor off because the overall term we'll end up looks like
-// (see, for example, the first unnumbered equation in B. Burley, "Physically Based Shading at Disney", SIGGRAPH 2012):
-//
-// F(L.V) D(N.H) G(N.L) G(N.V) / (4 N.L N.V)
-//
-// We're basically regouping this as
-//
-// F(L.V) D(N.H) [G(N.L)/(2 N.L)] [G(N.V) / (2 N.V)]
-//
-// and thus, this function implements the [G(N.m)/(2 N.m)] part with m = L or V.
-//
-// The contents of the D and G (G1) functions (GGX) are taken from
-// E. Heitz, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs", J. Comp. Graph. Tech. 3 (2) (2014).
-// Eqns 71-72 and 85-86 (see also Eqns 43 and 80).
-
-#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
-
-float G_GGX_2cos(float cos_theta_m, float alpha) {
- // Schlick's approximation
- // C. Schlick, "An Inexpensive BRDF Model for Physically-based Rendering", Computer Graphics Forum. 13 (3): 233 (1994)
- // Eq. (19), although see Heitz (2014) the about the problems with his derivation.
- // It nevertheless approximates GGX well with k = alpha/2.
- float k = 0.5 * alpha;
- return 0.5 / (cos_theta_m * (1.0 - k) + k);
-
- // float cos2 = cos_theta_m * cos_theta_m;
- // float sin2 = (1.0 - cos2);
- // return 1.0 / (cos_theta_m + sqrt(cos2 + alpha * alpha * sin2));
-}
-
-float D_GGX(float cos_theta_m, float alpha) {
- float alpha2 = alpha * alpha;
- float d = 1.0 + (alpha2 - 1.0) * cos_theta_m * cos_theta_m;
- return alpha2 / (M_PI * d * d);
-}
-
-float G_GGX_anisotropic_2cos(float cos_theta_m, float alpha_x, float alpha_y, float cos_phi, float sin_phi) {
- float cos2 = cos_theta_m * cos_theta_m;
- float sin2 = (1.0 - cos2);
- float s_x = alpha_x * cos_phi;
- float s_y = alpha_y * sin_phi;
- return 1.0 / max(cos_theta_m + sqrt(cos2 + (s_x * s_x + s_y * s_y) * sin2), 0.001);
-}
-
-float D_GGX_anisotropic(float cos_theta_m, float alpha_x, float alpha_y, float cos_phi, float sin_phi) {
- float cos2 = cos_theta_m * cos_theta_m;
- float sin2 = (1.0 - cos2);
- float r_x = cos_phi / alpha_x;
- float r_y = sin_phi / alpha_y;
- float d = cos2 + sin2 * (r_x * r_x + r_y * r_y);
- return 1.0 / max(M_PI * alpha_x * alpha_y * d * d, 0.001);
-}
-
-float SchlickFresnel(float u) {
- float m = 1.0 - u;
- float m2 = m * m;
- return m2 * m2 * m; // pow(m,5)
-}
-
-float GTR1(float NdotH, float a) {
- if (a >= 1.0) return 1.0 / M_PI;
- float a2 = a * a;
- float t = 1.0 + (a2 - 1.0) * NdotH * NdotH;
- return (a2 - 1.0) / (M_PI * log(a2) * t);
-}
-
-vec3 F0(float metallic, float specular, vec3 albedo) {
- float dielectric = 0.16 * specular * specular;
- // use albedo * metallic as colored specular reflectance at 0 angle for metallic materials;
- // see https://google.github.io/filament/Filament.md.html
- return mix(vec3(dielectric), albedo, vec3(metallic));
-}
-
-void light_compute(vec3 N, vec3 L, vec3 V, vec3 light_color, vec3 attenuation, vec3 diffuse_color, float roughness, float metallic, float specular, float specular_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- vec3 transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- float rim, float rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- float clearcoat, float clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- vec3 B, vec3 T, float anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- inout float alpha,
-#endif
- inout vec3 diffuse_light, inout vec3 specular_light) {
-
-#if defined(USE_LIGHT_SHADER_CODE)
- // light is written by the light shader
-
- vec3 normal = N;
- vec3 albedo = diffuse_color;
- vec3 light = L;
- vec3 view = V;
-
- /* clang-format off */
-
-LIGHT_SHADER_CODE
-
- /* clang-format on */
-
-#else
- float NdotL = dot(N, L);
- float cNdotL = max(NdotL, 0.0); // clamped NdotL
- float NdotV = dot(N, V);
- float cNdotV = max(NdotV, 0.0);
-
-#if defined(DIFFUSE_BURLEY) || defined(SPECULAR_BLINN) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED)
- vec3 H = normalize(V + L);
-#endif
-
-#if defined(SPECULAR_BLINN) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED)
- float cNdotH = max(dot(N, H), 0.0);
-#endif
-
-#if defined(DIFFUSE_BURLEY) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED)
- float cLdotH = max(dot(L, H), 0.0);
-#endif
-
- if (metallic < 1.0) {
-#if defined(DIFFUSE_OREN_NAYAR)
- vec3 diffuse_brdf_NL;
-#else
- float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance
-#endif
-
-#if defined(DIFFUSE_LAMBERT_WRAP)
- // energy conserving lambert wrap shader
- diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness)));
-
-#elif defined(DIFFUSE_OREN_NAYAR)
-
- {
- // see http://mimosa-pudica.net/improved-oren-nayar.html
- float LdotV = dot(L, V);
-
- float s = LdotV - NdotL * NdotV;
- float t = mix(1.0, max(NdotL, NdotV), step(0.0, s));
-
- float sigma2 = roughness * roughness; // TODO: this needs checking
- vec3 A = 1.0 + sigma2 * (-0.5 / (sigma2 + 0.33) + 0.17 * diffuse_color / (sigma2 + 0.13));
- float B = 0.45 * sigma2 / (sigma2 + 0.09);
-
- diffuse_brdf_NL = cNdotL * (A + vec3(B) * s / t) * (1.0 / M_PI);
- }
-
-#elif defined(DIFFUSE_TOON)
-
- diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL);
-
-#elif defined(DIFFUSE_BURLEY)
-
- {
- float FD90_minus_1 = 2.0 * cLdotH * cLdotH * roughness - 0.5;
- float FdV = 1.0 + FD90_minus_1 * SchlickFresnel(cNdotV);
- float FdL = 1.0 + FD90_minus_1 * SchlickFresnel(cNdotL);
- diffuse_brdf_NL = (1.0 / M_PI) * FdV * FdL * cNdotL;
- /*
- float energyBias = mix(roughness, 0.0, 0.5);
- float energyFactor = mix(roughness, 1.0, 1.0 / 1.51);
- float fd90 = energyBias + 2.0 * VoH * VoH * roughness;
- float f0 = 1.0;
- float lightScatter = f0 + (fd90 - f0) * pow(1.0 - cNdotL, 5.0);
- float viewScatter = f0 + (fd90 - f0) * pow(1.0 - cNdotV, 5.0);
-
- diffuse_brdf_NL = lightScatter * viewScatter * energyFactor;
- */
- }
-#else
- // lambert
- diffuse_brdf_NL = cNdotL * (1.0 / M_PI);
-#endif
-
- diffuse_light += light_color * diffuse_color * diffuse_brdf_NL * attenuation;
-
-#if defined(LIGHT_TRANSMISSION_USED)
- diffuse_light += light_color * diffuse_color * (vec3(1.0 / M_PI) - diffuse_brdf_NL) * transmission * attenuation;
-#endif
-
-#if defined(LIGHT_RIM_USED)
- float rim_light = pow(max(0.0, 1.0 - cNdotV), max(0.0, (1.0 - roughness) * 16.0));
- diffuse_light += rim_light * rim * mix(vec3(1.0), diffuse_color, rim_tint) * light_color;
-#endif
- }
-
- if (roughness > 0.0) { // FIXME: roughness == 0 should not disable specular light entirely
-
- // D
-
-#if defined(SPECULAR_BLINN)
-
- //normalized blinn
- float shininess = exp2(15.0 * (1.0 - roughness) + 1.0) * 0.25;
- float blinn = pow(cNdotH, shininess) * cNdotL;
- blinn *= (shininess + 8.0) * (1.0 / (8.0 * M_PI));
- float intensity = blinn;
-
- specular_light += light_color * intensity * specular_blob_intensity * attenuation;
-
-#elif defined(SPECULAR_PHONG)
-
- vec3 R = normalize(-reflect(L, N));
- float cRdotV = max(0.0, dot(R, V));
- float shininess = exp2(15.0 * (1.0 - roughness) + 1.0) * 0.25;
- float phong = pow(cRdotV, shininess);
- phong *= (shininess + 8.0) * (1.0 / (8.0 * M_PI));
- float intensity = (phong) / max(4.0 * cNdotV * cNdotL, 0.75);
-
- specular_light += light_color * intensity * specular_blob_intensity * attenuation;
-
-#elif defined(SPECULAR_TOON)
-
- vec3 R = normalize(-reflect(L, N));
- float RdotV = dot(R, V);
- float mid = 1.0 - roughness;
- mid *= mid;
- float intensity = smoothstep(mid - roughness * 0.5, mid + roughness * 0.5, RdotV) * mid;
- diffuse_light += light_color * intensity * specular_blob_intensity * attenuation; // write to diffuse_light, as in toon shading you generally want no reflection
-
-#elif defined(SPECULAR_DISABLED)
- // none..
-
-#elif defined(SPECULAR_SCHLICK_GGX)
- // shlick+ggx as default
-
-#if defined(LIGHT_ANISOTROPY_USED)
-
- float alpha_ggx = roughness * roughness;
- float aspect = sqrt(1.0 - anisotropy * 0.9);
- float ax = alpha_ggx / aspect;
- float ay = alpha_ggx * aspect;
- float XdotH = dot(T, H);
- float YdotH = dot(B, H);
- float D = D_GGX_anisotropic(cNdotH, ax, ay, XdotH, YdotH);
- float G = G_GGX_anisotropic_2cos(cNdotL, ax, ay, XdotH, YdotH) * G_GGX_anisotropic_2cos(cNdotV, ax, ay, XdotH, YdotH);
-
-#else
- float alpha_ggx = roughness * roughness;
- float D = D_GGX(cNdotH, alpha_ggx);
- float G = G_GGX_2cos(cNdotL, alpha_ggx) * G_GGX_2cos(cNdotV, alpha_ggx);
-#endif
- // F
- vec3 f0 = F0(metallic, specular, diffuse_color);
- float cLdotH5 = SchlickFresnel(cLdotH);
- vec3 F = mix(vec3(cLdotH5), vec3(1.0), f0);
-
- vec3 specular_brdf_NL = cNdotL * D * F * G;
-
- specular_light += specular_brdf_NL * light_color * specular_blob_intensity * attenuation;
-#endif
-
-#if defined(LIGHT_CLEARCOAT_USED)
-
-#if !defined(SPECULAR_SCHLICK_GGX)
- float cLdotH5 = SchlickFresnel(cLdotH);
-#endif
- float Dr = GTR1(cNdotH, mix(.1, .001, clearcoat_gloss));
- float Fr = mix(.04, 1.0, cLdotH5);
- float Gr = G_GGX_2cos(cNdotL, .25) * G_GGX_2cos(cNdotV, .25);
-
- float clearcoat_specular_brdf_NL = 0.25 * clearcoat * Gr * Fr * Dr * cNdotL;
-
- specular_light += clearcoat_specular_brdf_NL * light_color * specular_blob_intensity * attenuation;
-#endif
- }
-
-#ifdef USE_SHADOW_TO_OPACITY
- alpha = min(alpha, clamp(1.0 - length(attenuation), 0.0, 1.0));
-#endif
-
-#endif //defined(USE_LIGHT_SHADER_CODE)
-}
-
-#ifndef USE_NO_SHADOWS
-
-float sample_shadow(texture2D shadow, vec2 shadow_pixel_size, vec4 coord) {
-
- //todo optimize
- vec2 pos = coord.xy;
- float depth = coord.z;
-
-#ifdef SHADOW_MODE_PCF_13
-
- float avg = textureProj(shadow, vec4(pos, depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, 0.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, 0.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, -shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, -shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, -shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x * 2.0, 0.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x * 2.0, 0.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, shadow_pixel_size.y * 2.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, -shadow_pixel_size.y * 2.0), depth, 1.0));
- return avg * (1.0 / 13.0);
-#endif
-
-#ifdef SHADOW_MODE_PCF_5
-
- float avg = textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos, depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, 0.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, 0.0), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, shadow_pixel_size.y), depth, 1.0));
- avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, -shadow_pixel_size.y), depth, 1.0));
- return avg * (1.0 / 5.0);
-
-#endif
-
-#if !defined(SHADOW_MODE_PCF_5) || !defined(SHADOW_MODE_PCF_13)
-
- return textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos, depth, 1.0));
-
-#endif
-}
-
-#endif //USE_NO_SHADOWS
-
-void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 albedo, float roughness, float metallic, float specular, float p_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- vec3 transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- float rim, float rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- float clearcoat, float clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- vec3 binormal, vec3 tangent, float anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- inout float alpha,
-#endif
- inout vec3 diffuse_light, inout vec3 specular_light) {
-
- vec3 light_rel_vec = lights.data[idx].position - vertex;
- float light_length = length(light_rel_vec);
- float normalized_distance = light_length * lights.data[idx].inv_radius;
- vec2 attenuation_energy = unpackHalf2x16(lights.data[idx].attenuation_energy);
- float omni_attenuation = pow(max(1.0 - normalized_distance, 0.0), attenuation_energy.x);
- vec3 light_attenuation = vec3(omni_attenuation);
- vec4 color_specular = unpackUnorm4x8(lights.data[idx].color_specular);
- color_specular.rgb *= attenuation_energy.y;
-
-#ifndef USE_NO_SHADOWS
- vec4 shadow_color_enabled = unpackUnorm4x8(lights.data[idx].shadow_color_enabled);
- if (shadow_color_enabled.w > 0.5) {
- // there is a shadowmap
-
- vec4 splane = (lights.data[idx].shadow_matrix * vec4(vertex, 1.0));
- float shadow_len = length(splane);
- splane = normalize(splane);
- vec4 clamp_rect = lights.data[idx].atlas_rect;
-
- if (splane.z >= 0.0) {
-
- splane.z += 1.0;
-
- clamp_rect.y += clamp_rect.w;
-
- } else {
-
- splane.z = 1.0 - splane.z;
- }
-
- splane.xy /= splane.z;
- splane.xy = splane.xy * 0.5 + 0.5;
- splane.z = shadow_len * lights.data[idx].inv_radius;
- splane.xy = clamp_rect.xy + splane.xy * clamp_rect.zw;
- splane.w = 1.0; //needed? i think it should be 1 already
- float shadow = sample_shadow(shadow_atlas, scene_data.shadow_atlas_pixel_size, splane);
-
- light_attenuation *= mix(shadow_color_enabled.rgb, vec3(1.0), shadow);
- }
-#endif //USE_NO_SHADOWS
-
- light_compute(normal, normalize(light_rel_vec), eye_vec, color_specular.rgb, light_attenuation, albedo, roughness, metallic, specular, color_specular.a * p_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- rim * omni_attenuation, rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- clearcoat, clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- binormal, tangent, anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- alpha,
-#endif
- diffuse_light,
- specular_light);
-}
-
-void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 albedo, float roughness, float metallic, float specular, float p_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- vec3 transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- float rim, float rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- float clearcoat, float clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- vec3 binormal, vec3 tangent, float anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- inout float alpha,
-#endif
- inout vec3 diffuse_light,
- inout vec3 specular_light) {
-
- vec3 light_rel_vec = lights.data[idx].position - vertex;
- float light_length = length(light_rel_vec);
- float normalized_distance = light_length * lights.data[idx].inv_radius;
- vec2 attenuation_energy = unpackHalf2x16(lights.data[idx].attenuation_energy);
- float spot_attenuation = pow(max(1.0 - normalized_distance, 0.001), attenuation_energy.x);
- vec3 spot_dir = lights.data[idx].direction;
- vec2 spot_att_angle = unpackHalf2x16(lights.data[idx].cone_attenuation_angle);
- float scos = max(dot(-normalize(light_rel_vec), spot_dir), spot_att_angle.y);
- float spot_rim = max(0.0001, (1.0 - scos) / (1.0 - spot_att_angle.y));
- spot_attenuation *= 1.0 - pow(spot_rim, spot_att_angle.x);
- vec3 light_attenuation = vec3(spot_attenuation);
- vec4 color_specular = unpackUnorm4x8(lights.data[idx].color_specular);
- color_specular.rgb *= attenuation_energy.y;
-
-/*
- if (lights.data[idx].atlas_rect!=vec4(0.0)) {
- //use projector texture
- }
- */
-#ifndef USE_NO_SHADOWS
- vec4 shadow_color_enabled = unpackUnorm4x8(lights.data[idx].shadow_color_enabled);
- if (shadow_color_enabled.w > 0.5) {
- //there is a shadowmap
- vec4 splane = (lights.data[idx].shadow_matrix * vec4(vertex, 1.0));
- splane /= splane.w;
- float shadow = sample_shadow(shadow_atlas, scene_data.shadow_atlas_pixel_size, splane);
-
- light_attenuation *= mix(shadow_color_enabled.rgb, vec3(1.0), shadow);
- }
-
-#endif //USE_NO_SHADOWS
-
- light_compute(normal, normalize(light_rel_vec), eye_vec, color_specular.rgb, light_attenuation, albedo, roughness, metallic, specular, color_specular.a * p_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- rim * spot_attenuation, rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- clearcoat, clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- binormal, tangent, anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- alpha,
-#endif
- diffuse_light, specular_light);
-}
-
-void reflection_process(uint ref_index, vec3 vertex, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) {
-
- vec3 box_extents = reflections.data[ref_index].box_extents;
- vec3 local_pos = (reflections.data[ref_index].local_matrix * vec4(vertex, 1.0)).xyz;
-
- if (any(greaterThan(abs(local_pos), box_extents))) { //out of the reflection box
- return;
- }
-
- vec3 ref_vec = normalize(reflect(vertex, normal));
-
- vec3 inner_pos = abs(local_pos / box_extents);
- float blend = max(inner_pos.x, max(inner_pos.y, inner_pos.z));
- //make blend more rounded
- blend = mix(length(inner_pos), blend, blend);
- blend *= blend;
- blend = max(0.0, 1.0 - blend);
-
- if (reflections.data[ref_index].params.x > 0.0) { // compute reflection
-
- vec3 local_ref_vec = (reflections.data[ref_index].local_matrix * vec4(ref_vec, 0.0)).xyz;
-
- if (reflections.data[ref_index].params.w > 0.5) { //box project
-
- vec3 nrdir = normalize(local_ref_vec);
- vec3 rbmax = (box_extents - local_pos) / nrdir;
- vec3 rbmin = (-box_extents - local_pos) / nrdir;
-
- vec3 rbminmax = mix(rbmin, rbmax, greaterThan(nrdir, vec3(0.0, 0.0, 0.0)));
-
- float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z);
- vec3 posonbox = local_pos + nrdir * fa;
- local_ref_vec = posonbox - reflections.data[ref_index].box_offset;
- }
-
- vec4 reflection;
-
- reflection.rgb = textureLod(samplerCubeArray(reflection_atlas, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(local_ref_vec, reflections.data[ref_index].index), roughness * MAX_ROUGHNESS_LOD).rgb;
-
- if (reflections.data[ref_index].params.z < 0.5) {
- reflection.rgb = mix(specular_light, reflection.rgb, blend);
- }
-
- reflection.rgb *= reflections.data[ref_index].params.x;
- reflection.a = blend;
- reflection.rgb *= reflection.a;
-
- reflection_accum += reflection;
- }
-
-#if !defined(USE_LIGHTMAP) && !defined(USE_VOXEL_CONE_TRACING)
- if (reflections.data[ref_index].ambient.a > 0.0) { //compute ambient using skybox
-
- vec3 local_amb_vec = (reflections.data[ref_index].local_matrix * vec4(normal, 0.0)).xyz;
-
- vec4 ambient_out;
-
- ambient_out.rgb = textureLod(samplerCubeArray(reflection_atlas, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(local_amb_vec, reflections.data[ref_index].index), MAX_ROUGHNESS_LOD).rgb;
-
- ambient_out.a = blend;
- ambient_out.rgb = mix(reflections.data[ref_index].ambient.rgb, ambient_out.rgb, reflections.data[ref_index].ambient.a);
- if (reflections.data[ref_index].params.z < 0.5) {
- ambient_out.rgb = mix(ambient_light, ambient_out.rgb, blend);
- }
-
- ambient_out.rgb *= ambient_out.a;
- ambient_accum += ambient_out;
- } else {
-
- vec4 ambient_out;
- ambient_out.a = blend;
- ambient_out.rgb = reflections.data[ref_index].ambient.rgb;
- if (reflections.data[ref_index].params.z < 0.5) {
- ambient_out.rgb = mix(ambient_light, ambient_out.rgb, blend);
- }
- ambient_out.rgb *= ambient_out.a;
- ambient_accum += ambient_out;
- }
-#endif //USE_LIGHTMAP or VCT
-}
-
-#ifdef USE_VOXEL_CONE_TRACING
-
-//standard voxel cone trace
-vec4 voxel_cone_trace(texture3D probe, vec3 cell_size, vec3 pos, vec3 direction, float tan_half_angle, float max_distance, float p_bias) {
-
- float dist = p_bias;
- vec4 color = vec4(0.0);
-
- while (dist < max_distance && color.a < 0.95) {
- float diameter = max(1.0, 2.0 * tan_half_angle * dist);
- vec3 uvw_pos = (pos + dist * direction) * cell_size;
- float half_diameter = diameter * 0.5;
- //check if outside, then break
- if (any(greaterThan(abs(uvw_pos - 0.5), vec3(0.5f + half_diameter * cell_size)))) {
- break;
- }
- vec4 scolor = textureLod(sampler3D(probe, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, log2(diameter));
- float a = (1.0 - color.a);
- color += a * scolor;
- dist += half_diameter;
- }
-
- return color;
-}
-
-#ifndef GI_PROBE_HIGH_QUALITY
-//faster version for 45 degrees
-
-#ifdef GI_PROBE_USE_ANISOTROPY
-
-vec4 voxel_cone_trace_anisotropic_45_degrees(texture3D probe, texture3D aniso_pos, texture3D aniso_neg, vec3 normal, vec3 cell_size, vec3 pos, vec3 direction, float tan_half_angle, float max_distance, float p_bias) {
-
- float dist = p_bias;
- vec4 color = vec4(0.0);
- float radius = max(0.5, tan_half_angle * dist);
- float lod_level = log2(radius * 2.0);
-
- while (dist < max_distance && color.a < 0.95) {
- vec3 uvw_pos = (pos + dist * direction) * cell_size;
- //check if outside, then break
- if (any(greaterThan(abs(uvw_pos - 0.5), vec3(0.5f + radius * cell_size)))) {
- break;
- }
-
- vec4 scolor = textureLod(sampler3D(probe, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, lod_level);
- vec3 aniso_neg = textureLod(sampler3D(aniso_neg, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, lod_level).rgb;
- vec3 aniso_pos = textureLod(sampler3D(aniso_pos, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, lod_level).rgb;
-
- scolor.rgb *= dot(max(vec3(0.0), (normal * aniso_pos)), vec3(1.0)) + dot(max(vec3(0.0), (-normal * aniso_neg)), vec3(1.0));
- lod_level += 1.0;
-
- float a = (1.0 - color.a);
- scolor *= a;
- color += scolor;
- dist += radius;
- radius = max(0.5, tan_half_angle * dist);
- }
-
- return color;
-}
-#else
-
-vec4 voxel_cone_trace_45_degrees(texture3D probe, vec3 cell_size, vec3 pos, vec3 direction, float tan_half_angle, float max_distance, float p_bias) {
-
- float dist = p_bias;
- vec4 color = vec4(0.0);
- float radius = max(0.5, tan_half_angle * dist);
- float lod_level = log2(radius * 2.0);
-
- while (dist < max_distance && color.a < 0.95) {
- vec3 uvw_pos = (pos + dist * direction) * cell_size;
-
- //check if outside, then break
- if (any(greaterThan(abs(uvw_pos - 0.5), vec3(0.5f + radius * cell_size)))) {
- break;
- }
- vec4 scolor = textureLod(sampler3D(probe, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, lod_level);
- lod_level += 1.0;
-
- float a = (1.0 - color.a);
- scolor *= a;
- color += scolor;
- dist += radius;
- radius = max(0.5, tan_half_angle * dist);
- }
-
- return color;
-}
-
-#endif
-
-#elif defined(GI_PROBE_USE_ANISOTROPY)
-
-//standard voxel cone trace
-vec4 voxel_cone_trace_anisotropic(texture3D probe, texture3D aniso_pos, texture3D aniso_neg, vec3 normal, vec3 cell_size, vec3 pos, vec3 direction, float tan_half_angle, float max_distance, float p_bias) {
-
- float dist = p_bias;
- vec4 color = vec4(0.0);
-
- while (dist < max_distance && color.a < 0.95) {
- float diameter = max(1.0, 2.0 * tan_half_angle * dist);
- vec3 uvw_pos = (pos + dist * direction) * cell_size;
- float half_diameter = diameter * 0.5;
- //check if outside, then break
- if (any(greaterThan(abs(uvw_pos - 0.5), vec3(0.5f + half_diameter * cell_size)))) {
- break;
- }
- float log2_diameter = log2(diameter);
- vec4 scolor = textureLod(sampler3D(probe, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, log2_diameter);
- vec3 aniso_neg = textureLod(sampler3D(aniso_neg, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, log2_diameter).rgb;
- vec3 aniso_pos = textureLod(sampler3D(aniso_pos, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uvw_pos, log2_diameter).rgb;
-
- scolor.rgb *= dot(max(vec3(0.0), (normal * aniso_pos)), vec3(1.0)) + dot(max(vec3(0.0), (-normal * aniso_neg)), vec3(1.0));
-
- float a = (1.0 - color.a);
- scolor *= a;
- color += scolor;
- dist += half_diameter;
- }
-
- return color;
-}
-
-#endif
-
-void gi_probe_compute(uint index, vec3 position, vec3 normal, vec3 ref_vec, mat3 normal_xform, float roughness, vec3 ambient, vec3 environment, inout vec4 out_spec, inout vec4 out_diff) {
-
- position = (gi_probes.data[index].xform * vec4(position, 1.0)).xyz;
- ref_vec = normalize((gi_probes.data[index].xform * vec4(ref_vec, 0.0)).xyz);
- normal = normalize((gi_probes.data[index].xform * vec4(normal, 0.0)).xyz);
-
- position += normal * gi_probes.data[index].normal_bias;
-
- //this causes corrupted pixels, i have no idea why..
- if (any(bvec2(any(lessThan(position, vec3(0.0))), any(greaterThan(position, gi_probes.data[index].bounds))))) {
- return;
- }
-
- vec3 blendv = abs(position / gi_probes.data[index].bounds * 2.0 - 1.0);
- float blend = clamp(1.0 - max(blendv.x, max(blendv.y, blendv.z)), 0.0, 1.0);
- //float blend=1.0;
-
- float max_distance = length(gi_probes.data[index].bounds);
- vec3 cell_size = 1.0 / gi_probes.data[index].bounds;
-
- //radiance
-
-#ifdef GI_PROBE_HIGH_QUALITY
-
-#define MAX_CONE_DIRS 6
- vec3 cone_dirs[MAX_CONE_DIRS] = vec3[](
- vec3(0.0, 0.0, 1.0),
- vec3(0.866025, 0.0, 0.5),
- vec3(0.267617, 0.823639, 0.5),
- vec3(-0.700629, 0.509037, 0.5),
- vec3(-0.700629, -0.509037, 0.5),
- vec3(0.267617, -0.823639, 0.5));
-
- float cone_weights[MAX_CONE_DIRS] = float[](0.25, 0.15, 0.15, 0.15, 0.15, 0.15);
- float cone_angle_tan = 0.577;
-
-#elif defined(GI_PROBE_LOW_QUALITY)
-
-#define MAX_CONE_DIRS 1
-
- vec3 cone_dirs[MAX_CONE_DIRS] = vec3[](
- vec3(0.0, 0.0, 1.0));
-
- float cone_weights[MAX_CONE_DIRS] = float[](1.0);
- float cone_angle_tan = 4; //~76 degrees
-#else // MEDIUM QUALITY
-
-#define MAX_CONE_DIRS 4
-
- vec3 cone_dirs[MAX_CONE_DIRS] = vec3[](
- vec3(0.707107, 0.0, 0.707107),
- vec3(0.0, 0.707107, 0.707107),
- vec3(-0.707107, 0.0, 0.707107),
- vec3(0.0, -0.707107, 0.707107));
-
- float cone_weights[MAX_CONE_DIRS] = float[](0.25, 0.25, 0.25, 0.25);
- float cone_angle_tan = 0.98269;
-
-#endif
- vec3 light = vec3(0.0);
-
- for (int i = 0; i < MAX_CONE_DIRS; i++) {
-
- vec3 dir = normalize((gi_probes.data[index].xform * vec4(normal_xform * cone_dirs[i], 0.0)).xyz);
-
-#if defined(GI_PROBE_HIGH_QUALITY) || defined(GI_PROBE_LOW_QUALITY)
-
-#ifdef GI_PROBE_USE_ANISOTROPY
- vec4 cone_light = voxel_cone_trace_anisotropic(gi_probe_textures[gi_probes.data[index].texture_slot], gi_probe_textures[gi_probes.data[index].texture_slot + 1], gi_probe_textures[gi_probes.data[index].texture_slot + 2], normalize(mix(dir, normal, gi_probes.data[index].anisotropy_strength)), cell_size, position, dir, cone_angle_tan, max_distance, gi_probes.data[index].bias);
-#else
-
- vec4 cone_light = voxel_cone_trace(gi_probe_textures[gi_probes.data[index].texture_slot], cell_size, position, dir, cone_angle_tan, max_distance, gi_probes.data[index].bias);
-
-#endif // GI_PROBE_USE_ANISOTROPY
-
-#else
-
-#ifdef GI_PROBE_USE_ANISOTROPY
- vec4 cone_light = voxel_cone_trace_anisotropic_45_degrees(gi_probe_textures[gi_probes.data[index].texture_slot], gi_probe_textures[gi_probes.data[index].texture_slot + 1], gi_probe_textures[gi_probes.data[index].texture_slot + 2], normalize(mix(dir, normal, gi_probes.data[index].anisotropy_strength)), cell_size, position, dir, cone_angle_tan, max_distance, gi_probes.data[index].bias);
-#else
- vec4 cone_light = voxel_cone_trace_45_degrees(gi_probe_textures[gi_probes.data[index].texture_slot], cell_size, position, dir, cone_angle_tan, max_distance, gi_probes.data[index].bias);
-#endif // GI_PROBE_USE_ANISOTROPY
-
-#endif
- if (gi_probes.data[index].blend_ambient) {
- cone_light.rgb = mix(ambient, cone_light.rgb, min(1.0, cone_light.a / 0.95));
- }
-
- light += cone_weights[i] * cone_light.rgb;
- }
-
- light *= gi_probes.data[index].dynamic_range;
-
- if (gi_probes.data[index].ambient_occlusion > 0.001) {
-
- float size = 1.0 + gi_probes.data[index].ambient_occlusion_size * 7.0;
-
- float taps, blend;
- blend = modf(size, taps);
- float ao = 0.0;
- for (float i = 1.0; i <= taps; i++) {
- vec3 ofs = (position + normal * (i * 0.5 + 1.0)) * cell_size;
- ao += textureLod(sampler3D(gi_probe_textures[gi_probes.data[index].texture_slot], material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ofs, i - 1.0).a * i;
- }
-
- if (blend > 0.001) {
- vec3 ofs = (position + normal * ((taps + 1.0) * 0.5 + 1.0)) * cell_size;
- ao += textureLod(sampler3D(gi_probe_textures[gi_probes.data[index].texture_slot], material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ofs, taps).a * (taps + 1.0) * blend;
- }
-
- ao = 1.0 - min(1.0, ao);
-
- light = mix(scene_data.ao_color.rgb, light, mix(1.0, ao, gi_probes.data[index].ambient_occlusion));
- }
-
- out_diff += vec4(light * blend, blend);
-
- //irradiance
-#ifndef GI_PROBE_LOW_QUALITY
- vec4 irr_light = voxel_cone_trace(gi_probe_textures[gi_probes.data[index].texture_slot], cell_size, position, ref_vec, tan(roughness * 0.5 * M_PI * 0.99), max_distance, gi_probes.data[index].bias);
- if (gi_probes.data[index].blend_ambient) {
- irr_light.rgb = mix(environment, irr_light.rgb, min(1.0, irr_light.a / 0.95));
- }
- irr_light.rgb *= gi_probes.data[index].dynamic_range;
- //irr_light=vec3(0.0);
-
- out_spec += vec4(irr_light.rgb * blend, blend);
-#endif
-}
-
-#endif //USE_VOXEL_CONE_TRACING
-
-#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
-
-void main() {
-
-#ifdef MODE_DUAL_PARABOLOID
-
- if (dp_clip > 0.0)
- discard;
-#endif
-
- //lay out everything, whathever is unused is optimized away anyway
- vec3 vertex = vertex_interp;
- vec3 view = -normalize(vertex_interp);
- vec3 albedo = vec3(1.0);
- vec3 transmission = vec3(0.0);
- float metallic = 0.0;
- float specular = 0.5;
- vec3 emission = vec3(0.0);
- float roughness = 1.0;
- float rim = 0.0;
- float rim_tint = 0.0;
- float clearcoat = 0.0;
- float clearcoat_gloss = 0.0;
- float anisotropy = 0.0;
- vec2 anisotropy_flow = vec2(1.0, 0.0);
-
-#if defined(AO_USED)
- float ao = 1.0;
- float ao_light_affect = 0.0;
-#endif
-
- float alpha = 1.0;
-
-#if defined(ALPHA_SCISSOR_USED)
- float alpha_scissor = 0.5;
-#endif
-
-#if defined(TANGENT_USED) || defined(NORMALMAP_USED) || defined(LIGHT_ANISOTROPY_USED)
- vec3 binormal = normalize(binormal_interp);
- vec3 tangent = normalize(tangent_interp);
-#else
- vec3 binormal = vec3(0.0);
- vec3 tangent = vec3(0.0);
-#endif
- vec3 normal = normalize(normal_interp);
-
-#if defined(DO_SIDE_CHECK)
- if (!gl_FrontFacing) {
- normal = -normal;
- }
-#endif
-
-#if defined(UV_USED)
- vec2 uv = uv_interp;
-#endif
-
-#if defined(UV2_USED) || defined(USE_LIGHTMAP)
- vec2 uv2 = uv2_interp;
-#endif
-
-#if defined(COLOR_USED)
- vec4 color = color_interp;
-#endif
-
-#if defined(NORMALMAP_USED)
-
- vec3 normalmap = vec3(0.5);
-#endif
-
- float normaldepth = 1.0;
-
- vec2 screen_uv = gl_FragCoord.xy * scene_data.screen_pixel_size + scene_data.screen_pixel_size * 0.5; //account for center
-
- float sss_strength = 0.0;
-
- {
- /* clang-format off */
-
-FRAGMENT_SHADER_CODE
-
- /* clang-format on */
- }
-
-#if !defined(USE_SHADOW_TO_OPACITY)
-
-#if defined(ALPHA_SCISSOR_USED)
- if (alpha < alpha_scissor) {
- discard;
- }
-#endif // ALPHA_SCISSOR_USED
-
-#ifdef USE_OPAQUE_PREPASS
-
- if (alpha < opaque_prepass_threshold) {
- discard;
- }
-
-#endif // USE_OPAQUE_PREPASS
-
-#endif // !USE_SHADOW_TO_OPACITY
-
-#if defined(NORMALMAP_USED)
-
- normalmap.xy = normalmap.xy * 2.0 - 1.0;
- normalmap.z = sqrt(max(0.0, 1.0 - dot(normalmap.xy, normalmap.xy))); //always ignore Z, as it can be RG packed, Z may be pos/neg, etc.
-
- normal = normalize(mix(normal, tangent * normalmap.x + binormal * normalmap.y + normal * normalmap.z, normaldepth));
-
-#endif
-
-#if defined(LIGHT_ANISOTROPY_USED)
-
- if (anisotropy > 0.01) {
- //rotation matrix
- mat3 rot = mat3(tangent, binormal, normal);
- //make local to space
- tangent = normalize(rot * vec3(anisotropy_flow.x, anisotropy_flow.y, 0.0));
- binormal = normalize(rot * vec3(-anisotropy_flow.y, anisotropy_flow.x, 0.0));
- }
-
-#endif
-
-#ifdef ENABLE_CLIP_ALPHA
- if (albedo.a < 0.99) {
- //used for doublepass and shadowmapping
- discard;
- }
-#endif
-
- /////////////////////// LIGHTING //////////////////////////////
-
- //apply energy conservation
-
- vec3 specular_light = vec3(0.0, 0.0, 0.0);
- vec3 diffuse_light = vec3(0.0, 0.0, 0.0);
- vec3 ambient_light = vec3(0.0, 0.0, 0.0);
-
-#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
-
- if (scene_data.roughness_limiter_enabled) {
- float limit = texelFetch(sampler2D(roughness_buffer, material_samplers[SAMPLER_NEAREST_CLAMP]), ivec2(gl_FragCoord.xy), 0).r;
- roughness = max(roughness, limit);
- }
-
- if (scene_data.use_reflection_cubemap) {
-
- vec3 ref_vec = reflect(-view, normal);
- ref_vec = scene_data.radiance_inverse_xform * ref_vec;
-#ifdef USE_RADIANCE_CUBEMAP_ARRAY
-
- float lod, blend;
- blend = modf(roughness * MAX_ROUGHNESS_LOD, lod);
- specular_light = texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod)).rgb;
- specular_light = mix(specular_light, texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod + 1)).rgb, blend);
-
-#else
- specular_light = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ref_vec, roughness * MAX_ROUGHNESS_LOD).rgb;
-
-#endif //USE_RADIANCE_CUBEMAP_ARRAY
- specular_light *= scene_data.ambient_light_color_energy.a;
- }
-
-#ifndef USE_LIGHTMAP
- //lightmap overrides everything
- if (scene_data.use_ambient_light) {
-
- ambient_light = scene_data.ambient_light_color_energy.rgb;
-
- if (scene_data.use_ambient_cubemap) {
- vec3 ambient_dir = scene_data.radiance_inverse_xform * normal;
-#ifdef USE_RADIANCE_CUBEMAP_ARRAY
- vec3 cubemap_ambient = texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ambient_dir, MAX_ROUGHNESS_LOD)).rgb;
-#else
- vec3 cubemap_ambient = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ambient_dir, MAX_ROUGHNESS_LOD).rgb;
-#endif //USE_RADIANCE_CUBEMAP_ARRAY
-
- ambient_light = mix(ambient_light, cubemap_ambient * scene_data.ambient_light_color_energy.a, scene_data.ambient_color_sky_mix);
- }
- }
-#endif // USE_LIGHTMAP
-
-#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
-
- //radiance
-
- float specular_blob_intensity = 1.0;
-
-#if defined(SPECULAR_TOON)
- specular_blob_intensity *= specular * 2.0;
-#endif
-
-#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
- //gi probes
-
- //lightmap
-
- //lightmap capture
-
-#ifdef USE_VOXEL_CONE_TRACING
- { // process giprobes
- uint index1 = instances.data[instance_index].gi_offset & 0xFFFF;
- if (index1 != 0xFFFF) {
- vec3 ref_vec = normalize(reflect(normalize(vertex), normal));
- //find arbitrary tangent and bitangent, then build a matrix
- vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);
- vec3 tangent = normalize(cross(v0, normal));
- vec3 bitangent = normalize(cross(tangent, normal));
- mat3 normal_mat = mat3(tangent, bitangent, normal);
-
- vec4 amb_accum = vec4(0.0);
- vec4 spec_accum = vec4(0.0);
- gi_probe_compute(index1, vertex, normal, ref_vec, normal_mat, roughness * roughness, ambient_light, specular_light, spec_accum, amb_accum);
-
- uint index2 = instances.data[instance_index].gi_offset >> 16;
-
- if (index2 != 0xFFFF) {
- gi_probe_compute(index2, vertex, normal, ref_vec, normal_mat, roughness * roughness, ambient_light, specular_light, spec_accum, amb_accum);
- }
-
- if (amb_accum.a > 0.0) {
- amb_accum.rgb /= amb_accum.a;
- }
-
- if (spec_accum.a > 0.0) {
- spec_accum.rgb /= spec_accum.a;
- }
-
- specular_light = spec_accum.rgb;
- ambient_light = amb_accum.rgb;
- }
- }
-#endif
-
- uvec4 cluster_cell = texture(usampler3D(cluster_texture, material_samplers[SAMPLER_NEAREST_CLAMP]), vec3(screen_uv, (abs(vertex.z) - scene_data.z_near) / (scene_data.z_far - scene_data.z_near)));
-
- { // process reflections
-
- vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0);
- vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0);
-
- uint reflection_probe_count = cluster_cell.z >> CLUSTER_COUNTER_SHIFT;
- uint reflection_probe_pointer = cluster_cell.z & CLUSTER_POINTER_MASK;
-
- for (uint i = 0; i < reflection_probe_count; i++) {
-
- uint ref_index = cluster_data.indices[reflection_probe_pointer + i];
- reflection_process(ref_index, vertex, normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
- }
-
- if (reflection_accum.a > 0.0) {
- specular_light = reflection_accum.rgb / reflection_accum.a;
- }
-
-#if !defined(USE_LIGHTMAP)
- if (ambient_accum.a > 0.0) {
- ambient_light = ambient_accum.rgb / ambient_accum.a;
- }
-#endif
- }
-
- {
-
-#if defined(DIFFUSE_TOON)
- //simplify for toon, as
- specular_light *= specular * metallic * albedo * 2.0;
-#else
-
- // scales the specular reflections, needs to be be computed before lighting happens,
- // but after environment, GI, and reflection probes are added
- // Environment brdf approximation (Lazarov 2013)
- // see https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile
- const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
- const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
- vec4 r = roughness * c0 + c1;
- float ndotv = clamp(dot(normal, view), 0.0, 1.0);
- float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;
- vec2 env = vec2(-1.04, 1.04) * a004 + r.zw;
-
- vec3 f0 = F0(metallic, specular, albedo);
- specular_light *= env.x * f0 + env.y;
-#endif
- }
-
- { //directional light
-
- for (uint i = 0; i < scene_data.directional_light_count; i++) {
-
- if (!bool(directional_lights.data[i].mask & instances.data[instance_index].layer_mask)) {
- continue; //not masked
- }
-
- vec3 light_attenuation = vec3(1.0);
-
- if (directional_lights.data[i].shadow_enabled) {
- float depth_z = -vertex.z;
-
- vec4 pssm_coord;
-
- if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
- pssm_coord = (directional_lights.data[i].shadow_matrix1 * vec4(vertex, 1.0));
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
- pssm_coord = (directional_lights.data[i].shadow_matrix2 * vec4(vertex, 1.0));
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
- pssm_coord = (directional_lights.data[i].shadow_matrix3 * vec4(vertex, 1.0));
- } else {
- pssm_coord = (directional_lights.data[i].shadow_matrix4 * vec4(vertex, 1.0));
- }
-
- pssm_coord /= pssm_coord.w;
-
- float shadow = sample_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size, pssm_coord);
-
- if (directional_lights.data[i].blend_splits) {
-
- float pssm_blend;
-
- if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
- pssm_coord = (directional_lights.data[i].shadow_matrix2 * vec4(vertex, 1.0));
- pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z);
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
- pssm_coord = (directional_lights.data[i].shadow_matrix3 * vec4(vertex, 1.0));
- pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z);
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
- pssm_coord = (directional_lights.data[i].shadow_matrix4 * vec4(vertex, 1.0));
- pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z);
- } else {
- pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached)
- }
-
- pssm_coord /= pssm_coord.w;
-
- float shadow2 = sample_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size, pssm_coord);
- shadow = mix(shadow, shadow2, pssm_blend);
- }
-
- shadow = mix(shadow, 1.0, smoothstep(directional_lights.data[i].fade_from, directional_lights.data[i].fade_to, vertex.z)); //done with negative values for performance
-
- light_attenuation = mix(directional_lights.data[i].shadow_color, vec3(1.0), shadow);
- }
-
- light_compute(normal, directional_lights.data[i].direction, normalize(view), directional_lights.data[i].color * directional_lights.data[i].energy, light_attenuation, albedo, roughness, metallic, specular, directional_lights.data[i].specular * specular_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- rim, rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- clearcoat, clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- binormal, tangent, anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- alpha,
-#endif
- diffuse_light,
- specular_light);
- }
- }
-
- { //omni lights
-
- uint omni_light_count = cluster_cell.x >> CLUSTER_COUNTER_SHIFT;
- uint omni_light_pointer = cluster_cell.x & CLUSTER_POINTER_MASK;
-
- for (uint i = 0; i < omni_light_count; i++) {
-
- uint light_index = cluster_data.indices[omni_light_pointer + i];
-
- if (!bool(lights.data[light_index].mask & instances.data[instance_index].layer_mask)) {
- continue; //not masked
- }
-
- light_process_omni(light_index, vertex, view, normal, albedo, roughness, metallic, specular, specular_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- rim,
- rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- clearcoat, clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- tangent, binormal, anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- alpha,
-#endif
- diffuse_light, specular_light);
- }
- }
-
- { //spot lights
- uint spot_light_count = cluster_cell.y >> CLUSTER_COUNTER_SHIFT;
- uint spot_light_pointer = cluster_cell.y & CLUSTER_POINTER_MASK;
-
- for (uint i = 0; i < spot_light_count; i++) {
-
- uint light_index = cluster_data.indices[spot_light_pointer + i];
-
- if (!bool(lights.data[light_index].mask & instances.data[instance_index].layer_mask)) {
- continue; //not masked
- }
-
- light_process_spot(light_index, vertex, view, normal, albedo, roughness, metallic, specular, specular_blob_intensity,
-#ifdef LIGHT_TRANSMISSION_USED
- transmission,
-#endif
-#ifdef LIGHT_RIM_USED
- rim,
- rim_tint,
-#endif
-#ifdef LIGHT_CLEARCOAT_USED
- clearcoat, clearcoat_gloss,
-#endif
-#ifdef LIGHT_ANISOTROPY_USED
- tangent, binormal, anisotropy,
-#endif
-#ifdef USE_SHADOW_TO_OPACITY
- alpha,
-#endif
- diffuse_light, specular_light);
- }
- }
-
-#ifdef USE_SHADOW_TO_OPACITY
- alpha = min(alpha, clamp(length(ambient_light), 0.0, 1.0));
-
-#if defined(ALPHA_SCISSOR_USED)
- if (alpha < alpha_scissor) {
- discard;
- }
-#endif // ALPHA_SCISSOR_USED
-
-#ifdef USE_OPAQUE_PREPASS
-
- if (alpha < opaque_prepass_threshold) {
- discard;
- }
-
-#endif // USE_OPAQUE_PREPASS
-
-#endif // USE_SHADOW_TO_OPACITY
-
-#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
-
-#ifdef MODE_RENDER_DEPTH
-
-#ifdef MODE_RENDER_MATERIAL
-
- albedo_output_buffer.rgb = albedo;
- albedo_output_buffer.a = alpha;
-
- normal_output_buffer.rgb = normal * 0.5 + 0.5;
- normal_output_buffer.a = 0.0;
- depth_output_buffer.r = -vertex.z;
-
-#if defined(AO_USED)
- orm_output_buffer.r = ao;
-#else
- orm_output_buffer.r = 0.0;
-#endif
- orm_output_buffer.g = roughness;
- orm_output_buffer.b = metallic;
- orm_output_buffer.a = sss_strength;
-
- emission_output_buffer.rgb = emission;
- emission_output_buffer.a = 0.0;
-#endif
-
-#ifdef MODE_RENDER_NORMAL
- normal_output_buffer = vec4(normal * 0.5 + 0.5, 0.0);
-#ifdef MODE_RENDER_ROUGHNESS
- roughness_output_buffer = roughness;
-#endif //MODE_RENDER_ROUGHNESS
-#endif //MODE_RENDER_NORMAL
-
-//nothing happens, so a tree-ssa optimizer will result in no fragment shader :)
-#else
-
- specular_light *= scene_data.reflection_multiplier;
- ambient_light *= albedo; //ambient must be multiplied by albedo at the end
-
-//ambient occlusion
-#if defined(AO_USED)
-
- if (scene_data.ssao_enabled && scene_data.ssao_ao_affect > 0.0) {
- float ssao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r;
- ao = mix(ao, min(ao, ssao), scene_data.ssao_ao_affect);
- ao_light_affect = mix(ao_light_affect, max(ao_light_affect, scene_data.ssao_light_affect), scene_data.ssao_ao_affect);
- }
-
- ambient_light = mix(scene_data.ao_color.rgb, ambient_light, ao);
- ao_light_affect = mix(1.0, ao, ao_light_affect);
- specular_light = mix(scene_data.ao_color.rgb, specular_light, ao_light_affect);
- diffuse_light = mix(scene_data.ao_color.rgb, diffuse_light, ao_light_affect);
-
-#else
-
- if (scene_data.ssao_enabled) {
- float ao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r;
- ambient_light = mix(scene_data.ao_color.rgb, ambient_light, ao);
- float ao_light_affect = mix(1.0, ao, scene_data.ssao_light_affect);
- specular_light = mix(scene_data.ao_color.rgb, specular_light, ao_light_affect);
- diffuse_light = mix(scene_data.ao_color.rgb, diffuse_light, ao_light_affect);
- }
-
-#endif // AO_USED
-
- // base color remapping
- diffuse_light *= 1.0 - metallic; // TODO: avoid all diffuse and ambient light calculations when metallic == 1 up to this point
- ambient_light *= 1.0 - metallic;
-
- //fog
-
-#ifdef MODE_MULTIPLE_RENDER_TARGETS
-
-#ifdef MODE_UNSHADED
- diffuse_buffer = vec4(albedo.rgb, 0.0);
- specular_buffer = vec4(0.0);
-
-#else
-
- diffuse_buffer = vec4(emission + diffuse_light + ambient_light, sss_strength);
- specular_buffer = vec4(specular_light, metallic);
-
-#endif
-
-#else //MODE_MULTIPLE_RENDER_TARGETS
-
-#ifdef MODE_UNSHADED
- frag_color = vec4(albedo, alpha);
-#else
- frag_color = vec4(emission + ambient_light + diffuse_light + specular_light, alpha);
- //frag_color = vec4(1.0);
-
-#endif //USE_NO_SHADING
-
-#endif //MODE_MULTIPLE_RENDER_TARGETS
-
-#endif //MODE_RENDER_DEPTH
-}
diff --git a/servers/visual/rasterizer_rd/shaders/scene_high_end_inc.glsl b/servers/visual/rasterizer_rd/shaders/scene_high_end_inc.glsl
deleted file mode 100644
index baef1e060f..0000000000
--- a/servers/visual/rasterizer_rd/shaders/scene_high_end_inc.glsl
+++ /dev/null
@@ -1,266 +0,0 @@
-#define M_PI 3.14159265359
-#define ROUGHNESS_MAX_LOD 5
-
-layout(push_constant, binding = 0, std430) uniform DrawCall {
- uint instance_index;
- uint pad[3]; //16 bits minimum size
-}
-draw_call;
-
-/* Set 0 Scene data that never changes, ever */
-
-#define SAMPLER_NEAREST_CLAMP 0
-#define SAMPLER_LINEAR_CLAMP 1
-#define SAMPLER_NEAREST_WITH_MIPMAPS_CLAMP 2
-#define SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP 3
-#define SAMPLER_NEAREST_WITH_MIPMAPS_ANISOTROPIC_CLAMP 4
-#define SAMPLER_LINEAR_WITH_MIPMAPS_ANISOTROPIC_CLAMP 5
-#define SAMPLER_NEAREST_REPEAT 6
-#define SAMPLER_LINEAR_REPEAT 7
-#define SAMPLER_NEAREST_WITH_MIPMAPS_REPEAT 8
-#define SAMPLER_LINEAR_WITH_MIPMAPS_REPEAT 9
-#define SAMPLER_NEAREST_WITH_MIPMAPS_ANISOTROPIC_REPEAT 10
-#define SAMPLER_LINEAR_WITH_MIPMAPS_ANISOTROPIC_REPEAT 11
-
-layout(set = 0, binding = 1) uniform sampler material_samplers[12];
-
-layout(set = 0, binding = 2) uniform sampler shadow_sampler;
-
-layout(set = 0, binding = 3, std140) uniform SceneData {
-
- mat4 projection_matrix;
- mat4 inv_projection_matrix;
-
- mat4 camera_matrix;
- mat4 inv_camera_matrix;
-
- vec2 viewport_size;
- vec2 screen_pixel_size;
-
- //used for shadow mapping only
- float z_offset;
- float z_slope_scale;
-
- float time;
- float reflection_multiplier; // one normally, zero when rendering reflections
-
- vec4 ambient_light_color_energy;
-
- float ambient_color_sky_mix;
- bool use_ambient_light;
- bool use_ambient_cubemap;
- bool use_reflection_cubemap;
-
- mat3 radiance_inverse_xform;
-
- vec2 shadow_atlas_pixel_size;
- vec2 directional_shadow_pixel_size;
-
- uint directional_light_count;
- float dual_paraboloid_side;
- float z_far;
- float z_near;
-
- bool ssao_enabled;
- float ssao_light_affect;
- float ssao_ao_affect;
- bool roughness_limiter_enabled;
-
- vec4 ao_color;
-
-#if 0
- vec4 ambient_light_color;
- vec4 bg_color;
-
- vec4 fog_color_enabled;
- vec4 fog_sun_color_amount;
-
- float ambient_energy;
- float bg_energy;
-#endif
-
-#if 0
- vec2 shadow_atlas_pixel_size;
- vec2 directional_shadow_pixel_size;
-
- float z_far;
-
- float subsurface_scatter_width;
- float ambient_occlusion_affect_light;
- float ambient_occlusion_affect_ao_channel;
- float opaque_prepass_threshold;
-
- bool fog_depth_enabled;
- float fog_depth_begin;
- float fog_depth_end;
- float fog_density;
- float fog_depth_curve;
- bool fog_transmit_enabled;
- float fog_transmit_curve;
- bool fog_height_enabled;
- float fog_height_min;
- float fog_height_max;
- float fog_height_curve;
-#endif
-}
-scene_data;
-
-#define INSTANCE_FLAGS_FORWARD_MASK 0x7
-#define INSTANCE_FLAGS_FORWARD_OMNI_LIGHT_SHIFT 3
-#define INSTANCE_FLAGS_FORWARD_SPOT_LIGHT_SHIFT 6
-#define INSTANCE_FLAGS_FORWARD_DECAL_SHIFT 9
-
-#define INSTANCE_FLAGS_MULTIMESH (1 << 12)
-#define INSTANCE_FLAGS_MULTIMESH_FORMAT_2D (1 << 13)
-#define INSTANCE_FLAGS_MULTIMESH_HAS_COLOR (1 << 14)
-#define INSTANCE_FLAGS_MULTIMESH_HAS_CUSTOM_DATA (1 << 15)
-#define INSTANCE_FLAGS_MULTIMESH_STRIDE_SHIFT 16
-//3 bits of stride
-#define INSTANCE_FLAGS_MULTIMESH_STRIDE_MASK 0x7
-
-#define INSTANCE_FLAGS_SKELETON (1 << 19)
-
-struct InstanceData {
- mat4 transform;
- mat4 normal_transform;
- uint flags;
- uint instance_ofs; //instance_offset in instancing/skeleton buffer
- uint gi_offset; //GI information when using lightmapping (VCT or lightmap)
- uint layer_mask;
-};
-
-layout(set = 0, binding = 4, std430) buffer Instances {
- InstanceData data[];
-}
-instances;
-
-struct LightData { //this structure needs to be 128 bits
- vec3 position;
- float inv_radius;
- vec3 direction;
- uint attenuation_energy; //attenuation
- uint color_specular; //rgb color, a specular (8 bit unorm)
- uint cone_attenuation_angle; // attenuation and angle, (16bit float)
- uint mask;
- uint shadow_color_enabled; //shadow rgb color, a>0.5 enabled (8bit unorm)
- vec4 atlas_rect; //used for shadow atlas uv on omni, and for projection atlas on spot
- mat4 shadow_matrix;
-};
-
-layout(set = 0, binding = 5, std140) uniform Lights {
- LightData data[MAX_LIGHT_DATA_STRUCTS];
-}
-lights;
-
-struct ReflectionData {
-
- vec3 box_extents;
- float index;
- vec3 box_offset;
- uint mask;
- vec4 params; // intensity, 0, interior , boxproject
- vec4 ambient; // ambient color, energy
- mat4 local_matrix; // up to here for spot and omni, rest is for directional
- // notes: for ambientblend, use distance to edge to blend between already existing global environment
-};
-
-layout(set = 0, binding = 6, std140) uniform ReflectionProbeData {
- ReflectionData data[MAX_REFLECTION_DATA_STRUCTS];
-}
-reflections;
-
-struct DirectionalLightData {
- vec3 direction;
- float energy;
- vec3 color;
- float specular;
- vec3 shadow_color;
- uint mask;
- bool blend_splits;
- bool shadow_enabled;
- float fade_from;
- float fade_to;
- vec4 shadow_split_offsets;
- mat4 shadow_matrix1;
- mat4 shadow_matrix2;
- mat4 shadow_matrix3;
- mat4 shadow_matrix4;
-};
-
-layout(set = 0, binding = 7, std140) uniform DirectionalLights {
- DirectionalLightData data[MAX_DIRECTIONAL_LIGHT_DATA_STRUCTS];
-}
-directional_lights;
-
-struct GIProbeData {
- mat4 xform;
- vec3 bounds;
- float dynamic_range;
-
- float bias;
- float normal_bias;
- bool blend_ambient;
- uint texture_slot;
-
- float anisotropy_strength;
- float ambient_occlusion;
- float ambient_occlusion_size;
- uint pad2;
-};
-
-layout(set = 0, binding = 8, std140) uniform GIProbes {
- GIProbeData data[MAX_GI_PROBES];
-}
-gi_probes;
-
-layout(set = 0, binding = 9) uniform texture3D gi_probe_textures[MAX_GI_PROBE_TEXTURES];
-
-#define CLUSTER_COUNTER_SHIFT 20
-#define CLUSTER_POINTER_MASK ((1 << CLUSTER_COUNTER_SHIFT) - 1)
-#define CLUSTER_COUNTER_MASK 0xfff
-
-layout(set = 0, binding = 10) uniform utexture3D cluster_texture;
-
-layout(set = 0, binding = 11, std430) buffer ClusterData {
- uint indices[];
-}
-cluster_data;
-
-layout(set = 0, binding = 12) uniform texture2D directional_shadow_atlas;
-
-// decal atlas
-
-/* Set 1, Radiance */
-
-#ifdef USE_RADIANCE_CUBEMAP_ARRAY
-
-layout(set = 1, binding = 0) uniform textureCubeArray radiance_cubemap;
-
-#else
-
-layout(set = 1, binding = 0) uniform textureCube radiance_cubemap;
-
-#endif
-
-/* Set 2, Reflection and Shadow Atlases (view dependant) */
-
-layout(set = 2, binding = 0) uniform textureCubeArray reflection_atlas;
-
-layout(set = 2, binding = 1) uniform texture2D shadow_atlas;
-
-/* Set 1, Render Buffers */
-
-layout(set = 3, binding = 0) uniform texture2D depth_buffer;
-layout(set = 3, binding = 1) uniform texture2D color_buffer;
-layout(set = 3, binding = 2) uniform texture2D normal_buffer;
-layout(set = 3, binding = 3) uniform texture2D roughness_buffer;
-layout(set = 3, binding = 4) uniform texture2D ao_buffer;
-
-/* Set 4 Skeleton & Instancing (Multimesh) */
-
-layout(set = 4, binding = 0, std430) buffer Transforms {
- vec4 data[];
-}
-transforms;
-
-/* Set 5 User Material */
diff --git a/servers/visual/rasterizer_rd/shaders/sky.glsl b/servers/visual/rasterizer_rd/shaders/sky.glsl
deleted file mode 100644
index 28fd2883c3..0000000000
--- a/servers/visual/rasterizer_rd/shaders/sky.glsl
+++ /dev/null
@@ -1,79 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(location = 0) out vec2 uv_interp;
-/* clang-format on */
-
-layout(push_constant, binding = 1, std430) uniform Params {
- mat3 orientation;
- vec4 proj;
- float multiplier;
- float alpha;
- float depth;
- float pad;
-}
-params;
-
-void main() {
-
- vec2 base_arr[4] = vec2[](vec2(-1.0, -1.0), vec2(-1.0, 1.0), vec2(1.0, 1.0), vec2(1.0, -1.0));
- uv_interp = base_arr[gl_VertexIndex];
- gl_Position = vec4(uv_interp, params.depth, 1.0);
-}
-
-/* clang-format off */
-[fragment]
-
-#version 450
-
-VERSION_DEFINES
-
-#define M_PI 3.14159265359
-
-layout(location = 0) in vec2 uv_interp;
-/* clang-format on */
-
-layout(set = 0, binding = 0) uniform sampler2D source_panorama;
-
-layout(push_constant, binding = 1, std430) uniform Params {
- mat3 orientation;
- vec4 proj;
- float multiplier;
- float alpha;
- float depth;
- float pad;
-}
-params;
-
-vec4 texturePanorama(sampler2D pano, vec3 normal) {
-
- vec2 st = vec2(
- atan(normal.x, normal.z),
- acos(normal.y));
-
- if (st.x < 0.0)
- st.x += M_PI * 2.0;
-
- st /= vec2(M_PI * 2.0, M_PI);
-
- return texture(pano, st);
-}
-
-layout(location = 0) out vec4 frag_color;
-
-void main() {
-
- vec3 cube_normal;
- cube_normal.z = -1000000.0;
- cube_normal.x = (cube_normal.z * (-uv_interp.x - params.proj.x)) / params.proj.y;
- cube_normal.y = -(cube_normal.z * (-uv_interp.y - params.proj.z)) / params.proj.w;
- cube_normal = mat3(params.orientation) * cube_normal;
- cube_normal.z = -cube_normal.z;
-
- frag_color.rgb = texturePanorama(source_panorama, normalize(cube_normal.xyz)).rgb;
- frag_color.a = params.alpha;
-}
diff --git a/servers/visual/rasterizer_rd/shaders/ssao.glsl b/servers/visual/rasterizer_rd/shaders/ssao.glsl
deleted file mode 100644
index c9d7134610..0000000000
--- a/servers/visual/rasterizer_rd/shaders/ssao.glsl
+++ /dev/null
@@ -1,252 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-/* clang-format on */
-
-#define TWO_PI 6.283185307179586476925286766559
-
-#ifdef SSAO_QUALITY_HIGH
-#define NUM_SAMPLES (20)
-#endif
-
-#ifdef SSAO_QUALITY_ULTRA
-#define NUM_SAMPLES (48)
-#endif
-
-#ifdef SSAO_QUALITY_LOW
-#define NUM_SAMPLES (8)
-#endif
-
-#if !defined(SSAO_QUALITY_LOW) && !defined(SSAO_QUALITY_HIGH) && !defined(SSAO_QUALITY_ULTRA)
-#define NUM_SAMPLES (12)
-#endif
-
-// If using depth mip levels, the log of the maximum pixel offset before we need to switch to a lower
-// miplevel to maintain reasonable spatial locality in the cache
-// If this number is too small (< 3), too many taps will land in the same pixel, and we'll get bad variance that manifests as flashing.
-// If it is too high (> 5), we'll get bad performance because we're not using the MIP levels effectively
-#define LOG_MAX_OFFSET (3)
-
-// This must be less than or equal to the MAX_MIP_LEVEL defined in SSAO.cpp
-#define MAX_MIP_LEVEL (4)
-
-// This is the number of turns around the circle that the spiral pattern makes. This should be prime to prevent
-// taps from lining up. This particular choice was tuned for NUM_SAMPLES == 9
-
-const int ROTATIONS[] = int[](
- 1, 1, 2, 3, 2, 5, 2, 3, 2,
- 3, 3, 5, 5, 3, 4, 7, 5, 5, 7,
- 9, 8, 5, 5, 7, 7, 7, 8, 5, 8,
- 11, 12, 7, 10, 13, 8, 11, 8, 7, 14,
- 11, 11, 13, 12, 13, 19, 17, 13, 11, 18,
- 19, 11, 11, 14, 17, 21, 15, 16, 17, 18,
- 13, 17, 11, 17, 19, 18, 25, 18, 19, 19,
- 29, 21, 19, 27, 31, 29, 21, 18, 17, 29,
- 31, 31, 23, 18, 25, 26, 25, 23, 19, 34,
- 19, 27, 21, 25, 39, 29, 17, 21, 27);
-/* clang-format on */
-
-//#define NUM_SPIRAL_TURNS (7)
-const int NUM_SPIRAL_TURNS = ROTATIONS[NUM_SAMPLES - 1];
-
-layout(set = 0, binding = 0) uniform sampler2D source_depth_mipmaps;
-layout(r8, set = 1, binding = 0) uniform restrict writeonly image2D dest_image;
-
-#ifndef USE_HALF_SIZE
-layout(set = 2, binding = 0) uniform sampler2D source_depth;
-#endif
-
-layout(set = 3, binding = 0) uniform sampler2D source_normal;
-
-layout(push_constant, binding = 1, std430) uniform Params {
- ivec2 screen_size;
- float z_far;
- float z_near;
-
- bool orthogonal;
- float intensity_div_r6;
- float radius;
- float bias;
-
- vec4 proj_info;
- vec2 pixel_size;
- float proj_scale;
- uint pad;
-}
-params;
-
-vec3 reconstructCSPosition(vec2 S, float z) {
- if (params.orthogonal) {
- return vec3((S.xy * params.proj_info.xy + params.proj_info.zw), z);
- } else {
- return vec3((S.xy * params.proj_info.xy + params.proj_info.zw) * z, z);
- }
-}
-
-vec3 getPosition(ivec2 ssP) {
- vec3 P;
-#ifdef USE_HALF_SIZE
- P.z = texelFetch(source_depth_mipmaps, ssP, 0).r;
- P.z = -P.z;
-#else
- P.z = texelFetch(source_depth, ssP, 0).r;
-
- P.z = P.z * 2.0 - 1.0;
- if (params.orthogonal) {
- P.z = ((P.z + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0;
- } else {
- P.z = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - P.z * (params.z_far - params.z_near));
- }
- P.z = -P.z;
-#endif
- // Offset to pixel center
- P = reconstructCSPosition(vec2(ssP) + vec2(0.5), P.z);
- return P;
-}
-
-/** Returns a unit vector and a screen-space radius for the tap on a unit disk (the caller should scale by the actual disk radius) */
-vec2 tapLocation(int sampleNumber, float spinAngle, out float ssR) {
- // Radius relative to ssR
- float alpha = (float(sampleNumber) + 0.5) * (1.0 / float(NUM_SAMPLES));
- float angle = alpha * (float(NUM_SPIRAL_TURNS) * 6.28) + spinAngle;
-
- ssR = alpha;
- return vec2(cos(angle), sin(angle));
-}
-
-/** Read the camera-space position of the point at screen-space pixel ssP + unitOffset * ssR. Assumes length(unitOffset) == 1 */
-vec3 getOffsetPosition(ivec2 ssP, float ssR) {
- // Derivation:
- // mipLevel = floor(log(ssR / MAX_OFFSET));
-
- int mipLevel = clamp(int(floor(log2(ssR))) - LOG_MAX_OFFSET, 0, MAX_MIP_LEVEL);
-
- vec3 P;
-
- // We need to divide by 2^mipLevel to read the appropriately scaled coordinate from a MIP-map.
- // Manually clamp to the texture size because texelFetch bypasses the texture unit
- ivec2 mipP = clamp(ssP >> mipLevel, ivec2(0), (params.screen_size >> mipLevel) - ivec2(1));
-
-#ifdef USE_HALF_SIZE
- P.z = texelFetch(source_depth_mipmaps, mipP, mipLevel).r;
- P.z = -P.z;
-#else
- if (mipLevel < 1) {
- //read from depth buffer
- P.z = texelFetch(source_depth, mipP, 0).r;
- P.z = P.z * 2.0 - 1.0;
- if (params.orthogonal) {
- P.z = ((P.z + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0;
- } else {
- P.z = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - P.z * (params.z_far - params.z_near));
- }
- P.z = -P.z;
-
- } else {
- //read from mipmaps
- P.z = texelFetch(source_depth_mipmaps, mipP, mipLevel - 1).r;
- P.z = -P.z;
- }
-#endif
-
- // Offset to pixel center
- P = reconstructCSPosition(vec2(ssP) + vec2(0.5), P.z);
-
- return P;
-}
-
-/** Compute the occlusion due to sample with index \a i about the pixel at \a ssC that corresponds
- to camera-space point \a C with unit normal \a n_C, using maximum screen-space sampling radius \a ssDiskRadius
-
- Note that units of H() in the HPG12 paper are meters, not
- unitless. The whole falloff/sampling function is therefore
- unitless. In this implementation, we factor out (9 / radius).
-
- Four versions of the falloff function are implemented below
-*/
-float sampleAO(in ivec2 ssC, in vec3 C, in vec3 n_C, in float ssDiskRadius, in float p_radius, in int tapIndex, in float randomPatternRotationAngle) {
- // Offset on the unit disk, spun for this pixel
- float ssR;
- vec2 unitOffset = tapLocation(tapIndex, randomPatternRotationAngle, ssR);
- ssR *= ssDiskRadius;
-
- ivec2 ssP = ivec2(ssR * unitOffset) + ssC;
-
- if (any(lessThan(ssP, ivec2(0))) || any(greaterThanEqual(ssP, params.screen_size))) {
- return 0.0;
- }
-
- // The occluding point in camera space
- vec3 Q = getOffsetPosition(ssP, ssR);
-
- vec3 v = Q - C;
-
- float vv = dot(v, v);
- float vn = dot(v, n_C);
-
- const float epsilon = 0.01;
- float radius2 = p_radius * p_radius;
-
- // A: From the HPG12 paper
- // Note large epsilon to avoid overdarkening within cracks
- //return float(vv < radius2) * max((vn - bias) / (epsilon + vv), 0.0) * radius2 * 0.6;
-
- // B: Smoother transition to zero (lowers contrast, smoothing out corners). [Recommended]
- float f = max(radius2 - vv, 0.0);
- return f * f * f * max((vn - params.bias) / (epsilon + vv), 0.0);
-
- // C: Medium contrast (which looks better at high radii), no division. Note that the
- // contribution still falls off with radius^2, but we've adjusted the rate in a way that is
- // more computationally efficient and happens to be aesthetically pleasing.
- // return 4.0 * max(1.0 - vv * invRadius2, 0.0) * max(vn - bias, 0.0);
-
- // D: Low contrast, no division operation
- // return 2.0 * float(vv < radius * radius) * max(vn - bias, 0.0);
-}
-
-void main() {
- // Pixel being shaded
- ivec2 ssC = ivec2(gl_GlobalInvocationID.xy);
- if (any(greaterThan(ssC, params.screen_size))) { //too large, do nothing
- return;
- }
-
- // World space point being shaded
- vec3 C = getPosition(ssC);
-
-#ifdef USE_HALF_SIZE
- vec3 n_C = texelFetch(source_normal, ssC << 1, 0).xyz * 2.0 - 1.0;
-#else
- vec3 n_C = texelFetch(source_normal, ssC, 0).xyz * 2.0 - 1.0;
-#endif
- n_C = normalize(n_C);
- n_C.y = -n_C.y; //because this code reads flipped
-
- // Hash function used in the HPG12 AlchemyAO paper
- float randomPatternRotationAngle = mod(float((3 * ssC.x ^ ssC.y + ssC.x * ssC.y) * 10), TWO_PI);
-
- // Reconstruct normals from positions. These will lead to 1-pixel black lines
- // at depth discontinuities, however the blur will wipe those out so they are not visible
- // in the final image.
-
- // Choose the screen-space sample radius
- // proportional to the projected area of the sphere
-
- float ssDiskRadius = -params.proj_scale * params.radius;
- if (!params.orthogonal) {
- ssDiskRadius = -params.proj_scale * params.radius / C.z;
- }
- float sum = 0.0;
- for (int i = 0; i < NUM_SAMPLES; ++i) {
- sum += sampleAO(ssC, C, n_C, ssDiskRadius, params.radius, i, randomPatternRotationAngle);
- }
-
- float A = max(0.0, 1.0 - sum * params.intensity_div_r6 * (5.0 / float(NUM_SAMPLES)));
-
- imageStore(dest_image, ssC, vec4(A));
-}
diff --git a/servers/visual/rasterizer_rd/shaders/ssao_blur.glsl b/servers/visual/rasterizer_rd/shaders/ssao_blur.glsl
deleted file mode 100644
index e90c788e08..0000000000
--- a/servers/visual/rasterizer_rd/shaders/ssao_blur.glsl
+++ /dev/null
@@ -1,157 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-/* clang-format on */
-
-layout(set = 0, binding = 0) uniform sampler2D source_ssao;
-layout(set = 1, binding = 0) uniform sampler2D source_depth;
-#ifdef MODE_UPSCALE
-layout(set = 2, binding = 0) uniform sampler2D source_depth_mipmaps;
-#endif
-
-layout(r8, set = 3, binding = 0) uniform restrict writeonly image2D dest_image;
-
-//////////////////////////////////////////////////////////////////////////////////////////////
-// Tunable Parameters:
-
-layout(push_constant, binding = 1, std430) uniform Params {
- float edge_sharpness; /** Increase to make depth edges crisper. Decrease to reduce flicker. */
- int filter_scale;
- float z_far;
- float z_near;
- bool orthogonal;
- uint pad0;
- uint pad1;
- uint pad2;
- ivec2 axis; /** (1, 0) or (0, 1) */
- ivec2 screen_size;
-}
-params;
-
-/** Filter radius in pixels. This will be multiplied by SCALE. */
-#define R (4)
-
-//////////////////////////////////////////////////////////////////////////////////////////////
-
-// Gaussian coefficients
-const float gaussian[R + 1] =
- //float[](0.356642, 0.239400, 0.072410, 0.009869);
- //float[](0.398943, 0.241971, 0.053991, 0.004432, 0.000134); // stddev = 1.0
- float[](0.153170, 0.144893, 0.122649, 0.092902, 0.062970); // stddev = 2.0
-//float[](0.111220, 0.107798, 0.098151, 0.083953, 0.067458, 0.050920, 0.036108); // stddev = 3.0
-
-void main() {
-
- // Pixel being shaded
- ivec2 ssC = ivec2(gl_GlobalInvocationID.xy);
- if (any(greaterThan(ssC, params.screen_size))) { //too large, do nothing
- return;
- }
-
-#ifdef MODE_UPSCALE
-
- //closest one should be the same pixel, but check nearby just in case
- float depth = texelFetch(source_depth, ssC, 0).r;
-
- depth = depth * 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));
- }
-
- vec2 pixel_size = 1.0 / vec2(params.screen_size);
- vec2 closest_uv = vec2(ssC) * pixel_size + pixel_size * 0.5;
- vec2 from_uv = closest_uv;
- vec2 ps2 = pixel_size; // * 2.0;
-
- float closest_depth = abs(textureLod(source_depth_mipmaps, closest_uv, 0.0).r - depth);
-
- vec2 offsets[4] = vec2[](vec2(ps2.x, 0), vec2(-ps2.x, 0), vec2(0, ps2.y), vec2(0, -ps2.y));
- for (int i = 0; i < 4; i++) {
- vec2 neighbour = from_uv + offsets[i];
- float neighbour_depth = abs(textureLod(source_depth_mipmaps, neighbour, 0.0).r - depth);
- if (neighbour_depth < closest_depth) {
- closest_uv = neighbour;
- closest_depth = neighbour_depth;
- }
- }
-
- float visibility = textureLod(source_ssao, closest_uv, 0.0).r;
- imageStore(dest_image, ssC, vec4(visibility));
-#else
-
- float depth = texelFetch(source_depth, ssC, 0).r;
-
-#ifdef MODE_FULL_SIZE
- depth = depth * 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));
- }
-
-#endif
- float depth_divide = 1.0 / params.z_far;
-
- //depth *= depth_divide;
-
- /*
- if (depth > params.z_far * 0.999) {
- discard; //skybox
- }
- */
-
- float sum = texelFetch(source_ssao, ssC, 0).r;
-
- // Base weight for depth falloff. Increase this for more blurriness,
- // decrease it for better edge discrimination
- float BASE = gaussian[0];
- float totalWeight = BASE;
- sum *= totalWeight;
-
- ivec2 clamp_limit = params.screen_size - ivec2(1);
-
- for (int r = -R; r <= R; ++r) {
- // We already handled the zero case above. This loop should be unrolled and the static branch optimized out,
- // so the IF statement has no runtime cost
- if (r != 0) {
-
- ivec2 ppos = ssC + params.axis * (r * params.filter_scale);
- float value = texelFetch(source_ssao, clamp(ppos, ivec2(0), clamp_limit), 0).r;
- ivec2 rpos = clamp(ppos, ivec2(0), clamp_limit);
-
- float temp_depth = texelFetch(source_depth, rpos, 0).r;
-#ifdef MODE_FULL_SIZE
- temp_depth = temp_depth * 2.0 - 1.0;
- if (params.orthogonal) {
- temp_depth = ((temp_depth + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0;
- } else {
- temp_depth = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - temp_depth * (params.z_far - params.z_near));
- }
- //temp_depth *= depth_divide;
-#endif
- // spatial domain: offset gaussian tap
- float weight = 0.3 + gaussian[abs(r)];
- //weight *= max(0.0, dot(temp_normal, normal));
-
- // range domain (the "bilateral" weight). As depth difference increases, decrease weight.
- weight *= max(0.0, 1.0 - params.edge_sharpness * abs(temp_depth - depth));
-
- sum += value * weight;
- totalWeight += weight;
- }
- }
-
- const float epsilon = 0.0001;
- float visibility = sum / (totalWeight + epsilon);
-
- imageStore(dest_image, ssC, vec4(visibility));
-#endif
-}
diff --git a/servers/visual/rasterizer_rd/shaders/ssao_minify.glsl b/servers/visual/rasterizer_rd/shaders/ssao_minify.glsl
deleted file mode 100644
index 8728154347..0000000000
--- a/servers/visual/rasterizer_rd/shaders/ssao_minify.glsl
+++ /dev/null
@@ -1,48 +0,0 @@
-/* clang-format off */
-[compute]
-
-#version 450
-
-VERSION_DEFINES
-
-layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-/* clang-format on */
-
-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));
-}
diff --git a/servers/visual/rasterizer_rd/shaders/tonemap.glsl b/servers/visual/rasterizer_rd/shaders/tonemap.glsl
deleted file mode 100644
index 524ca5e2ea..0000000000
--- a/servers/visual/rasterizer_rd/shaders/tonemap.glsl
+++ /dev/null
@@ -1,305 +0,0 @@
-/* clang-format off */
-[vertex]
-
-#version 450
-
-VERSION_DEFINES
-
-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
-
-layout(location = 0) in vec2 uv_interp;
-/* clang-format on */
-
-layout(set = 0, binding = 0) uniform sampler2D source_color;
-layout(set = 1, binding = 0) uniform sampler2D source_auto_exposure;
-layout(set = 2, binding = 0) uniform sampler2D source_glow;
-layout(set = 3, binding = 0) uniform sampler3D color_correction;
-
-layout(push_constant, binding = 1, std430) uniform Params {
- vec3 bcs;
- bool use_bcs;
-
- bool use_glow;
- bool use_auto_exposure;
- bool use_color_correction;
- uint tonemapper;
-
- uvec2 glow_texture_size;
-
- float glow_intensity;
- uint glow_level_flags;
- uint glow_mode;
-
- float exposure;
- float white;
- float auto_exposure_grey;
-}
-params;
-
-layout(location = 0) out vec4 frag_color;
-
-#ifdef USE_GLOW_FILTER_BICUBIC
-// w0, w1, w2, and w3 are the four cubic B-spline basis functions
-float w0(float a) {
- return (1.0f / 6.0f) * (a * (a * (-a + 3.0f) - 3.0f) + 1.0f);
-}
-
-float w1(float a) {
- return (1.0f / 6.0f) * (a * a * (3.0f * a - 6.0f) + 4.0f);
-}
-
-float w2(float a) {
- return (1.0f / 6.0f) * (a * (a * (-3.0f * a + 3.0f) + 3.0f) + 1.0f);
-}
-
-float w3(float a) {
- return (1.0f / 6.0f) * (a * a * a);
-}
-
-// g0 and g1 are the two amplitude functions
-float g0(float a) {
- return w0(a) + w1(a);
-}
-
-float g1(float a) {
- return w2(a) + w3(a);
-}
-
-// h0 and h1 are the two offset functions
-float h0(float a) {
- return -1.0f + w1(a) / (w0(a) + w1(a));
-}
-
-float h1(float a) {
- return 1.0f + w3(a) / (w2(a) + w3(a));
-}
-
-vec4 texture2D_bicubic(sampler2D tex, vec2 uv, int p_lod) {
- float lod = float(p_lod);
- vec2 tex_size = vec2(params.glow_texture_size >> p_lod);
- vec2 pixel_size = vec2(1.0f) / tex_size;
-
- uv = uv * tex_size + vec2(0.5f);
-
- vec2 iuv = floor(uv);
- vec2 fuv = fract(uv);
-
- float g0x = g0(fuv.x);
- float g1x = g1(fuv.x);
- float h0x = h0(fuv.x);
- float h1x = h1(fuv.x);
- float h0y = h0(fuv.y);
- float h1y = h1(fuv.y);
-
- vec2 p0 = (vec2(iuv.x + h0x, iuv.y + h0y) - vec2(0.5f)) * pixel_size;
- vec2 p1 = (vec2(iuv.x + h1x, iuv.y + h0y) - vec2(0.5f)) * pixel_size;
- vec2 p2 = (vec2(iuv.x + h0x, iuv.y + h1y) - vec2(0.5f)) * pixel_size;
- vec2 p3 = (vec2(iuv.x + h1x, iuv.y + h1y) - vec2(0.5f)) * pixel_size;
-
- return (g0(fuv.y) * (g0x * textureLod(tex, p0, lod) + g1x * textureLod(tex, p1, lod))) +
- (g1(fuv.y) * (g0x * textureLod(tex, p2, lod) + g1x * textureLod(tex, p3, lod)));
-}
-
-#define GLOW_TEXTURE_SAMPLE(m_tex, m_uv, m_lod) texture2D_bicubic(m_tex, m_uv, m_lod)
-
-#else
-
-#define GLOW_TEXTURE_SAMPLE(m_tex, m_uv, m_lod) textureLod(m_tex, m_uv, float(m_lod))
-
-#endif
-
-vec3 tonemap_filmic(vec3 color, float white) {
- // exposure bias: input scale (color *= bias, white *= bias) to make the brightness consistent with other tonemappers
- // also useful to scale the input to the range that the tonemapper is designed for (some require very high input values)
- // has no effect on the curve's general shape or visual properties
- const float exposure_bias = 2.0f;
- const float A = 0.22f * exposure_bias * exposure_bias; // bias baked into constants for performance
- const float B = 0.30f * exposure_bias;
- const float C = 0.10f;
- const float D = 0.20f;
- const float E = 0.01f;
- const float F = 0.30f;
-
- vec3 color_tonemapped = ((color * (A * color + C * B) + D * E) / (color * (A * color + B) + D * F)) - E / F;
- float white_tonemapped = ((white * (A * white + C * B) + D * E) / (white * (A * white + B) + D * F)) - E / F;
-
- return color_tonemapped / white_tonemapped;
-}
-
-vec3 tonemap_aces(vec3 color, float white) {
- const float exposure_bias = 0.85f;
- const float A = 2.51f * exposure_bias * exposure_bias;
- const float B = 0.03f * exposure_bias;
- const float C = 2.43f * exposure_bias * exposure_bias;
- const float D = 0.59f * exposure_bias;
- const float E = 0.14f;
-
- vec3 color_tonemapped = (color * (A * color + B)) / (color * (C * color + D) + E);
- float white_tonemapped = (white * (A * white + B)) / (white * (C * white + D) + E);
-
- return color_tonemapped / white_tonemapped;
-}
-
-vec3 tonemap_reinhard(vec3 color, float white) {
- return (white * color + color) / (color * white + white);
-}
-
-vec3 linear_to_srgb(vec3 color) {
- //if going to srgb, clamp from 0 to 1.
- color = clamp(color, vec3(0.0), vec3(1.0));
- const vec3 a = vec3(0.055f);
- return mix((vec3(1.0f) + a) * pow(color.rgb, vec3(1.0f / 2.4f)) - a, 12.92f * color.rgb, lessThan(color.rgb, vec3(0.0031308f)));
-}
-
-#define TONEMAPPER_LINEAR 0
-#define TONEMAPPER_REINHARD 1
-#define TONEMAPPER_FILMIC 2
-#define TONEMAPPER_ACES 3
-
-vec3 apply_tonemapping(vec3 color, float white) { // inputs are LINEAR, always outputs clamped [0;1] color
-
- if (params.tonemapper == TONEMAPPER_LINEAR) {
- return color;
- } else if (params.tonemapper == TONEMAPPER_REINHARD) {
- return tonemap_reinhard(color, white);
- } else if (params.tonemapper == TONEMAPPER_FILMIC) {
- return tonemap_filmic(color, white);
- } else { //aces
- return tonemap_aces(color, white);
- }
-}
-
-vec3 gather_glow(sampler2D tex, vec2 uv) { // sample all selected glow levels
- vec3 glow = vec3(0.0f);
-
- if (bool(params.glow_level_flags & (1 << 0))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 0).rgb;
- }
-
- if (bool(params.glow_level_flags & (1 << 1))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 1).rgb;
- }
-
- if (bool(params.glow_level_flags & (1 << 2))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 2).rgb;
- }
-
- if (bool(params.glow_level_flags & (1 << 3))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 3).rgb;
- }
-
- if (bool(params.glow_level_flags & (1 << 4))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 4).rgb;
- }
-
- if (bool(params.glow_level_flags & (1 << 5))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 5).rgb;
- }
-
- if (bool(params.glow_level_flags & (1 << 6))) {
- glow += GLOW_TEXTURE_SAMPLE(tex, uv, 6).rgb;
- }
-
- return glow;
-}
-
-#define GLOW_MODE_ADD 0
-#define GLOW_MODE_SCREEN 1
-#define GLOW_MODE_SOFTLIGHT 2
-#define GLOW_MODE_REPLACE 3
-#define GLOW_MODE_MIX 4
-
-vec3 apply_glow(vec3 color, vec3 glow) { // apply glow using the selected blending mode
- if (params.glow_mode == GLOW_MODE_ADD) {
- return color + glow;
- } else if (params.glow_mode == GLOW_MODE_SCREEN) {
- //need color clamping
- return max((color + glow) - (color * glow), vec3(0.0));
- } else if (params.glow_mode == GLOW_MODE_SOFTLIGHT) {
- //need color clamping
- glow = glow * vec3(0.5f) + vec3(0.5f);
-
- color.r = (glow.r <= 0.5f) ? (color.r - (1.0f - 2.0f * glow.r) * color.r * (1.0f - color.r)) : (((glow.r > 0.5f) && (color.r <= 0.25f)) ? (color.r + (2.0f * glow.r - 1.0f) * (4.0f * color.r * (4.0f * color.r + 1.0f) * (color.r - 1.0f) + 7.0f * color.r)) : (color.r + (2.0f * glow.r - 1.0f) * (sqrt(color.r) - color.r)));
- color.g = (glow.g <= 0.5f) ? (color.g - (1.0f - 2.0f * glow.g) * color.g * (1.0f - color.g)) : (((glow.g > 0.5f) && (color.g <= 0.25f)) ? (color.g + (2.0f * glow.g - 1.0f) * (4.0f * color.g * (4.0f * color.g + 1.0f) * (color.g - 1.0f) + 7.0f * color.g)) : (color.g + (2.0f * glow.g - 1.0f) * (sqrt(color.g) - color.g)));
- color.b = (glow.b <= 0.5f) ? (color.b - (1.0f - 2.0f * glow.b) * color.b * (1.0f - color.b)) : (((glow.b > 0.5f) && (color.b <= 0.25f)) ? (color.b + (2.0f * glow.b - 1.0f) * (4.0f * color.b * (4.0f * color.b + 1.0f) * (color.b - 1.0f) + 7.0f * color.b)) : (color.b + (2.0f * glow.b - 1.0f) * (sqrt(color.b) - color.b)));
- return color;
- } else { //replace
- return glow;
- }
-}
-
-vec3 apply_bcs(vec3 color, vec3 bcs) {
- color = mix(vec3(0.0f), color, bcs.x);
- color = mix(vec3(0.5f), color, bcs.y);
- color = mix(vec3(dot(vec3(1.0f), color) * 0.33333f), color, bcs.z);
-
- return color;
-}
-
-vec3 apply_color_correction(vec3 color, sampler3D correction_tex) {
- return texture(correction_tex, color).rgb;
-}
-
-void main() {
- vec3 color = textureLod(source_color, uv_interp, 0.0f).rgb;
-
- // Exposure
-
- if (params.use_auto_exposure) {
- color /= texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / params.auto_exposure_grey;
- }
-
- color *= params.exposure;
-
- // Early Tonemap & SRGB Conversion
-
- if (params.use_glow && params.glow_mode == GLOW_MODE_MIX) {
-
- vec3 glow = gather_glow(source_glow, uv_interp);
- color.rgb = mix(color.rgb, glow, params.glow_intensity);
- }
-
- color = apply_tonemapping(color, params.white);
-
- color = linear_to_srgb(color); // regular linear -> SRGB conversion
-
- // Glow
-
- if (params.use_glow && params.glow_mode != GLOW_MODE_MIX) {
-
- vec3 glow = gather_glow(source_glow, uv_interp) * params.glow_intensity;
-
- // high dynamic range -> SRGB
- glow = apply_tonemapping(glow, params.white);
- glow = linear_to_srgb(glow);
-
- color = apply_glow(color, glow);
- }
-
- // Additional effects
-
- if (params.use_bcs) {
- color = apply_bcs(color, params.bcs);
- }
-
- if (params.use_color_correction) {
- color = apply_color_correction(color, color_correction);
- }
-
- frag_color = vec4(color, 1.0f);
-}