From ed4d75c49870c0d02538443d5f335a3d77023d9b Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 13 Dec 2020 13:24:55 +0300 Subject: [PATCH] Support setting cascade map splits in light options --- .../include/psemek/gfx/renderer/deferred.hpp | 1 + libs/gfx/source/renderer/deferred.cpp | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp index 4e2bbdd7..a532c435 100644 --- a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp +++ b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp @@ -72,6 +72,7 @@ namespace psemek::gfx bool shadowed = true; std::size_t shadow_map_size = 1024; std::size_t cascades = 4; + std::vector> cascade_ranges; }; struct point_light diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index abab8e7f..3aafdc7d 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -1497,20 +1497,31 @@ void main() auto dir = geom::as_vector(camera_clip_planes[4]); std::vector> cascade_splits(l.cascades); - float offset; { + float offset; auto dir_length = geom::length(dir); float near = camera_clip_planes[4][3] / dir_length; dir /= dir_length; offset = geom::dot(camera_position - geom::point::zero(), dir); near += offset; float far = -camera_clip_planes[5][3] / geom::length(geom::as_vector(camera_clip_planes[5])) - offset; - float lambda = 1.f / 24.f; - for (int i = 0; i < l.cascades; ++i) + + if (l.cascade_ranges.empty()) { - cascade_splits[i].max = (1.f - lambda) * near * std::pow(far / near, i * 1.f / l.cascades) + lambda * (near + (far - near) * (i * 1.f / l.cascades)); - cascade_splits[i].min = (1.f - lambda) * near * std::pow(far / near, (i + 1) * 1.f / l.cascades) + lambda * (near + (far - near) * ((i + 1) * 1.f / l.cascades)); - cascade_splits[i] -= offset; + float lambda = 1.f / 24.f; + for (int i = 0; i < l.cascades; ++i) + { + cascade_splits[i].max = (1.f - lambda) * near * std::pow(far / near, i * 1.f / l.cascades) + lambda * (near + (far - near) * (i * 1.f / l.cascades)); + cascade_splits[i].min = (1.f - lambda) * near * std::pow(far / near, (i + 1) * 1.f / l.cascades) + lambda * (near + (far - near) * ((i + 1) * 1.f / l.cascades)); + cascade_splits[i] -= offset; + } + } + else + { + for (int i = 0; i < l.cascades; ++i) + { + cascade_splits[i] = - l.cascade_ranges[i] - offset; + } } } @@ -1578,10 +1589,7 @@ void main() } for (auto const & v : geom::vertices(casts_shadow_bbox)) - { -// light_bbox[2].min = std::min(light_bbox[2].min, geom::dot(light_axes[2], v - origin)); light_bbox[2] |= geom::dot(light_axes[2], v - origin); - } light_transform[cascade] = geom::orthographic_camera{light_bbox}.projection() * geom::homogeneous(geom::by_rows(light_axes[0], light_axes[1], light_axes[2]));