summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2024-09-01 18:42:27 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2024-09-01 18:42:27 +0100
commit7299b08977acafe7eeba620f229a7169256f23cf (patch)
tree6c5bf1879720feecfb1d9ee0dcfcb95a1b80b3e2
parentUse billboard shadows for foliage (diff)
downloadilt-7299b08977acafe7eeba620f229a7169256f23cf.tar.bz2
ilt-7299b08977acafe7eeba620f229a7169256f23cf.tar.xz
ilt-7299b08977acafe7eeba620f229a7169256f23cf.zip
Extend depth of shadow box 10m to allow for depth offsets and clamp stencil to it
-rw-r--r--gfx/gl/shaders/shadowDynamicPointStencil.gs1
-rw-r--r--gfx/gl/shadowMapper.cpp13
2 files changed, 8 insertions, 6 deletions
diff --git a/gfx/gl/shaders/shadowDynamicPointStencil.gs b/gfx/gl/shaders/shadowDynamicPointStencil.gs
index 6d707ae..2873691 100644
--- a/gfx/gl/shaders/shadowDynamicPointStencil.gs
+++ b/gfx/gl/shaders/shadowDynamicPointStencil.gs
@@ -24,6 +24,7 @@ main()
vec4 pos = viewProjection[gl_Layer] * vec4(vworldPos[0], 1);
for (int c = 0; c < corners.length(); ++c) {
gl_Position = pos + vec4(scale.xy * corners[c], 0, 0);
+ gl_Position.z = max(gl_Position.z, -1);
texCoord = (corners[c] * 0.5) + 0.5;
EmitVertex();
}
diff --git a/gfx/gl/shadowMapper.cpp b/gfx/gl/shadowMapper.cpp
index ac161e2..b08538d 100644
--- a/gfx/gl/shadowMapper.cpp
+++ b/gfx/gl/shadowMapper.cpp
@@ -102,12 +102,13 @@ ShadowMapper::update(const SceneProvider & scene, const Direction3D & dir, const
std::transform(bandViewExtents.begin(), std::prev(bandViewExtents.end()), std::next(bandViewExtents.begin()),
std::back_inserter(out),
[bands = bandViewExtents.size() - 2, &lightViewDir, &sizes](const auto & near, const auto & far) mutable {
- const auto extents_minmax = [extents = std::span {near.begin(), far.end()}](auto && comp) {
- const auto mm = std::minmax_element(extents.begin(), extents.end(), comp);
- return std::make_pair(comp.get(*mm.first), comp.get(*mm.second));
- };
- const std::array extents
- = {extents_minmax(CompareBy {0}), extents_minmax(CompareBy {1}), extents_minmax(CompareBy {2})};
+ const auto extents_minmax
+ = [extents = std::span {near.begin(), far.end()}](auto && comp, RelativeDistance extra) {
+ const auto mm = std::minmax_element(extents.begin(), extents.end(), comp);
+ return std::make_pair(comp.get(*mm.first) - extra, comp.get(*mm.second) + extra);
+ };
+ const std::array extents = {extents_minmax(CompareBy {0}, 0), extents_minmax(CompareBy {1}, 0),
+ extents_minmax(CompareBy {2}, 10'000)};
const auto lightProjection = [](const auto & x, const auto & y, const auto & z) {
return glm::ortho(x.first, x.second, y.first, y.second, -z.second, -z.first);