summaryrefslogtreecommitdiff
path: root/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'renderer.cpp')
-rw-r--r--renderer.cpp47
1 files changed, 29 insertions, 18 deletions
diff --git a/renderer.cpp b/renderer.cpp
index a9d590a..8bc2d94 100644
--- a/renderer.cpp
+++ b/renderer.cpp
@@ -71,6 +71,8 @@ void Renderer::init(
id(FORWARD, 512);
for (i = SHADOW_MAP_START; i < SHADOW_MAP_END; i++)
id(i, 512);
+ for (i = SHADOW_JIT_START; i < SHADOW_JIT_END; i++)
+ id(i, 512);
camera_count = 1;
cameras.init();
globals.init(
@@ -101,6 +103,7 @@ void Renderer::init(
ts_caster_config_binding = ts_shader->descriptor_binding("caster_config");
ts_casters_binding = ts_shader->descriptor_binding("casters");
ts_globals_binding = ts_shader->descriptor_binding("globals");
+ ts_prev_occlusion_binding = ts_shader->descriptor_binding("prev_occlusion");
assert(ts_shadowmap_binding >= 0);
assert(ts_depthmap_binding >= 0);
assert(ts_prev_binding >= 0);
@@ -109,6 +112,7 @@ void Renderer::init(
assert(ts_caster_config_binding >= 0);
assert(ts_casters_binding >= 0);
assert(ts_globals_binding >= 0);
+ assert(ts_prev_occlusion_binding >= 0);
make_ts_sampler(d);
frame = 0;
}
@@ -178,7 +182,7 @@ void Renderer::temporal_shadows(
int i, c = l->caster_count;
Camera& cam = get_camera(drawlists[FORWARD].camera);
TS_Cbuffer* cbuf = (TS_Cbuffer*)ts_config.map(dev);
- TS_Caster_Config* casters = (TS_Caster_Config*)ts_config.map(dev);
+ TS_Caster_Config* casters = (TS_Caster_Config*)ts_config2.map(dev);
for (i = 0; i < c; i++) {
casters[i].index = i;
}
@@ -195,6 +199,7 @@ void Renderer::temporal_shadows(
auto& pass = pb
.begin_rp()
.rp_target(l->ss_shadow_slices[ind][i], Clear_Mode::discard)
+ .rp_target(l->occlusion[ind], Clear_Mode::discard)
.build_rp();
auto& pip = pb
.begin()
@@ -212,6 +217,10 @@ void Renderer::temporal_shadows(
ts_depthmap_binding,
dev->get_depth_target(),
ts_sampler)
+ .texture(
+ ts_prev_occlusion_binding,
+ l->occlusion[!ind],
+ ts_sampler)
.cbuffer(ts_config_binding, ts_config.gpuonly)
.cbuffer(
ts_caster_config_binding,
@@ -219,7 +228,7 @@ void Renderer::temporal_shadows(
i * sizeof(TS_Caster_Config),
sizeof(TS_Caster_Config))
.cbuffer(ts_globals_binding, globals.gpuonly)
- .sbuffer(ts_casters_binding, l->casters.gpuonly)
+ .sbuffer(ts_casters_binding, l->gpu_casters.gpuonly)
.build();
quad.render(
ctx,
@@ -251,11 +260,11 @@ void Renderer::render(
.rp_target(hdr_target, Clear_Mode::restore)
.rp_depth_target(dev->get_depth_target(), Clear_Mode::restore)
.build_rp();
- Render_Pass* shadow_passes[Lighting::max_shadows];
- for (i = 0; i < Lighting::max_shadows; i++) {
+ Render_Pass* shadow_passes[drawlist_count];
+ for (i = SHADOW_MAP_START, j = 0; i < SHADOW_JIT_END; i++, j++) {
shadow_passes[i] = &pb
.begin_rp()
- .rp_depth_target(l->shadow_slices[i], 1.0f)
+ .rp_depth_target(l->shadow_slices[j], 1.0f)
.build_rp();
}
@@ -263,20 +272,22 @@ void Renderer::render(
drawlists[FORWARD].render(*this, dev, a, l, depth_prepass, 0);
ctx.debug_pop();
+ auto shadows = [&]<typename T>(int s, T cam) {
+ for (i = s, j = 0; j < l->caster_count; i++, j++) {
+ auto o = [](Pipeline_Builder& pb) {
+ pb.cull(Cull_Mode::front);
+ };
+ setcam(i, l->casters[j].*cam);
+ ctx.debug_push("shadow map");
+ drawlists[i].render(*this, dev, a, l, *shadow_passes[i], o);
+ ctx.debug_pop();
+ }
+ };
ctx.debug_push("shadow maps");
- for (
- i = SHADOW_MAP_START, j = 0;
- i < SHADOW_MAP_END && j < l->caster_count;
- i++, j++
- ) {
- auto o = [](Pipeline_Builder& pb) {
- pb.cull(Cull_Mode::front);
- };
- setcam(i, l->cameras[j]);
- ctx.debug_push("shadow map");
- drawlists[i].render(*this, dev, a, l, *shadow_passes[j], o);
- ctx.debug_pop();
- }
+ shadows(SHADOW_MAP_START, &Caster::reality);
+ ctx.debug_pop();
+ ctx.debug_push("jittered shadow maps");
+ shadows(SHADOW_JIT_START, &Caster::jittered);
ctx.debug_pop();
temporal_shadows(dev, ctx, l, pb);