diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index 21541cb0..d58732c3 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -910,6 +910,7 @@ void main() assert(opts.camera); auto const camera_transform = opts.camera->transform(); auto const camera_position = opts.camera->position(); + auto const camera_direction = opts.camera->direction(); // Sort objects by mask & compute bbox @@ -938,7 +939,7 @@ void main() if (o.mat->casts_shadow) casts_shadow_bbox |= o.bbox; } - auto render_all = [&](auto & program, auto && predicate) + auto render_all = [&](auto & program, auto && predicate, bool clip_by_camera = false) { for (auto const & p : objects_by_mask) { @@ -954,6 +955,21 @@ void main() { auto const & o = objects[i]; + if (clip_by_camera) + { + bool clipped = true; + for (int c = 0; c < 8; ++c) + { + if (dot(o.bbox.corner(c & 1, (c & 2) >> 1, (c & 4) >> 1) - camera_position, camera_direction) > 0.f) + { + clipped = false; + break; + } + } + if (clipped) + continue; + } + if (mask & O_UNIFORM_COLOR) program["u_color"] = *o.mat->color; @@ -1103,7 +1119,7 @@ void main() impl().g_buffer_pass_program["u_camera_transform"] = camera_transform; impl().g_buffer_pass_program["u_max_intensity"] = opts.max_intensity; - render_all(impl().g_buffer_pass_program, [](auto mask){ return !(mask & O_TRANSPARENT); }); + render_all(impl().g_buffer_pass_program, [](auto mask){ return !(mask & O_TRANSPARENT); }, true); // Render unlit transparent objects @@ -1119,7 +1135,7 @@ void main() gl::DepthMask(gl::FALSE); - render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }); + render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }, true); // Render bloom @@ -1139,7 +1155,7 @@ void main() impl().bloom_pass_program["u_camera_transform"] = camera_transform; impl().bloom_pass_program["u_max_intensity"] = opts.max_intensity; - render_all(impl().bloom_pass_program, [](auto mask){ return (mask & O_BLOOMING); }); + render_all(impl().bloom_pass_program, [](auto mask){ return (mask & O_BLOOMING); }, true); } // Render unlit transparent objects to bloom @@ -1153,7 +1169,7 @@ void main() gl::Enable(gl::BLEND); gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::ZERO, gl::ONE); - render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }); + render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }, true); } gl::Disable(gl::BLEND);