From 088d2077a1bc523d63d817cc1e4488023d7b43b3 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 24 Jul 2021 01:10:29 -0400 Subject: [PATCH] Add ability to edit shader to enable filtering dim values for experimentation --- .../dual-downsample-filtered-frag.glsl | 31 ++++++++++++++----- voxygen/src/render/renderer/drawer.rs | 15 +++++++-- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl b/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl index 01235bf798..b4a54ec5c6 100644 --- a/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl +++ b/assets/voxygen/shaders/dual-downsample-filtered-frag.glsl @@ -14,27 +14,27 @@ layout(location = 0) in vec2 uv; layout(location = 0) out vec4 tgt_color; -vec4 simplesample(vec2 uv) { - return textureLod(sampler2D(t_src_color, s_src_color), uv, 0); +vec4 simplefetch(ivec2 uv) { + return texelFetch(sampler2D(t_src_color, s_src_color), uv, 0); } // check whether the texel color is higher than threshold, if so output as brightness color vec4 filterDim(vec4 color) { // TODO: note where this constant came from if we keep it float brightness = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722)); - if(brightness > 1.0) + if(brightness > 1.00) return vec4(color.rgb, 1.0); else return vec4(0.0, 0.0, 0.0, 1.0); } vec4 filteredFetch(ivec2 uv) { - return filterDim(simplesample(uv)); + return filterDim(simplefetch(uv)); } // Derived from: https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf vec4 filteredDownsample(vec2 uv, vec2 halfpixel) { - vec2 tex_res = 2.0 / halfpixel; + vec2 tex_res = 0.5 / halfpixel; // coordinate of the top left texel // _ _ _ _ // |x|_|_|_| @@ -68,6 +68,23 @@ vec4 filteredDownsample(vec2 uv, vec2 halfpixel) { return sum / 32.0; } -void main() { - tgt_color = filteredDownsample(uv, halfpixel); +vec4 simplesample(vec2 uv) { + return textureLod(sampler2D(t_src_color, s_src_color), uv, 0); +} + +// From: https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf +vec4 downsample(vec2 uv, vec2 halfpixel) { + vec4 sum = simplesample(uv) * 4.0; + sum += simplesample(uv - halfpixel.xy); + sum += simplesample(uv + halfpixel.xy); + sum += simplesample(uv + vec2(halfpixel.x, -halfpixel.y)); + sum += simplesample(uv - vec2(halfpixel.x, -halfpixel.y)); + + return sum / 8.0; +} + +void main() { + // Uncomment to experiment with filtering out dim pixels + //tgt_color = filteredDownsample(uv, halfpixel); + tgt_color = downsample(uv, halfpixel); } diff --git a/voxygen/src/render/renderer/drawer.rs b/voxygen/src/render/renderer/drawer.rs index f0e2a301bd..4c5bc22887 100644 --- a/voxygen/src/render/renderer/drawer.rs +++ b/voxygen/src/render/renderer/drawer.rs @@ -277,12 +277,23 @@ impl<'frame> Drawer<'frame> { (0..bloom::NUM_SIZES - 1).for_each(|index| { let bind = &locals.bloom_binds[index].bind_group; let view = &views.bloom_tgts[index + 1]; - let label = format!("downsample {}", index + 1); + // Do filtering out of non-bright things during the first downsample + let (label, pipeline) = if index == 0 { + ( + format!("downsample filtered {}", index + 1), + &pipelines.bloom.downsample_filtered, + ) + } else { + ( + format!("downsample {}", index + 1), + &pipelines.bloom.downsample, + ) + }; run_bloom_pass( bind, view, label, - &pipelines.bloom.downsample, + pipeline, wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), ); });