summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2025-02-22 23:24:35 +1100
committerquou <quou@disroot.org>2025-02-22 23:25:55 +1100
commit3634e53cc68671a576754d6bb668f585f7e2c53d (patch)
tree7e22902d96d13d3cecc72c92155de47f8db5f5de
parented5d6dfa2ed08c5a9185f3eb4ffb4deb898ed2af (diff)
basic temporal coherence for shadowHEADmaster
-rw-r--r--c2.cpp1
-rw-r--r--intermediate/ts.glsl15
-rw-r--r--lighting.cpp8
-rw-r--r--renderer.cpp6
-rw-r--r--renderer.hpp2
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;