From 3634e53cc68671a576754d6bb668f585f7e2c53d Mon Sep 17 00:00:00 2001 From: quou Date: Sat, 22 Feb 2025 23:24:35 +1100 Subject: basic temporal coherence for shadow --- c2.cpp | 1 + intermediate/ts.glsl | 15 +++++++++++++-- lighting.cpp | 8 ++++---- renderer.cpp | 6 +++--- renderer.hpp | 2 ++ 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/c2.cpp b/c2.cpp index 3867280..3a14ea5 100644 --- a/c2.cpp +++ b/c2.cpp @@ -836,6 +836,7 @@ struct C2 : public App { Texture& bb = dev->get_texture(hdr_target); pcam.asp = (float)bb.w / (float)bb.h; + renderer.prev_vp = pcam.get_proj() * pcam.get_view(); orbit_cam.update_orbit(*this); pcam.update(); lighting.update(dev, ctx, *world, renderer, scene); diff --git a/intermediate/ts.glsl b/intermediate/ts.glsl index 23195f6..61dd728 100644 --- a/intermediate/ts.glsl +++ b/intermediate/ts.glsl @@ -138,11 +138,22 @@ vec3 get_world_pos(float depth, vec2 uv) { } void main() { + float w_prev = 0.9; + float w_cur = 0.1; vec2 uv = interpolator.uv; float d = texture(depthmap, uv).r; vec3 wpos = get_world_pos(d, uv); - float prev = texture(previous, uv).r; + vec4 prev_pos = config.prev_vp * vec4(wpos, 1.0); + vec2 prev_uv = (prev_pos.xy / prev_pos.w) * 0.5 + 0.5; + float prev = texture(previous, prev_uv).r; float current = get_shadow(caster_config.index, wpos); - shadow_amount = (prev + current) * 0.5; + if ( + prev_uv.x < 0.0 || prev_uv.x > 1.0 || + prev_uv.y < 0.0 || prev_uv.y > 1.0 + ) { + w_prev = 0.0; + w_cur = 1.0; + } + shadow_amount = (prev * w_prev + current * w_cur); } #endif diff --git a/lighting.cpp b/lighting.cpp index 4f1fdfb..1eb4298 100644 --- a/lighting.cpp +++ b/lighting.cpp @@ -108,7 +108,7 @@ void Lighting::recreate(Device* dev, int w, int h) { for (i = 0; i < 2; i++) { ss_shadows[i] = dev->create_texture( "Shadow accumulation buffer", - texture_format_r8i, + texture_format_r16f, Texture_Flags::sampleable | Texture_Flags::colour_target, w, h, @@ -121,10 +121,10 @@ void Lighting::recreate(Device* dev, int w, int h) { ss_shadow_slices[i][j] = dev->alias_texture( ss_shadows[i], "Shadow accumulation buffer slice", - texture_format_r8i, + texture_format_r16f, Texture_Flags::colour_target, - shadow_res, - shadow_res, + w, + h, 1, 1, 1, diff --git a/renderer.cpp b/renderer.cpp index ffc0a3c..a9d590a 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -54,9 +54,8 @@ void Renderer::make_ts_sampler(Device* d) { s.min = Filter_Mode::point; s.mag = Filter_Mode::point; s.mip = Filter_Mode::point; - s.address_u = Address_Mode::border; - s.address_v = Address_Mode::border; - s.border[0] = 0.0f; + s.address_u = Address_Mode::clamp; + s.address_v = Address_Mode::clamp; ts_sampler = d->create_sampler("temporal shadow sampler", s); } @@ -185,6 +184,7 @@ void Renderer::temporal_shadows( } cbuf->inv_view = cam.get_view().inverse(); cbuf->inv_proj = cam.get_proj().inverse(); + cbuf->prev_vp = prev_vp; ts_config.unmap(dev); ts_config2.unmap(dev); ctx.debug_push("temporal shadows"); diff --git a/renderer.hpp b/renderer.hpp index 46f5331..387032d 100644 --- a/renderer.hpp +++ b/renderer.hpp @@ -67,6 +67,8 @@ struct Renderer { Sampler_Id ts_sampler; Staged_Buffer ts_config, ts_config2; + m4f prev_vp; + Sampler_Id clamped_linear; Texture_Id env_cubemap; -- cgit v1.2.3-54-g00ecf