diff options
Diffstat (limited to 'renderer.cpp')
-rw-r--r-- | renderer.cpp | 47 |
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); |