aboutsummaryrefslogtreecommitdiff
path: root/src/client/shadows
diff options
context:
space:
mode:
authorx2048 <codeforsmile@gmail.com>2021-07-11 17:15:19 +0200
committerGitHub <noreply@github.com>2021-07-11 08:15:19 -0700
commitf5706d444b02ccc1fcd854968087172d50cfcca2 (patch)
tree073af762f7981cf49b0be4fdbd203ecc341df811 /src/client/shadows
parent1d25d1f7ad35f739e8a64c2bdb44105998aed19b (diff)
downloadminetest-f5706d444b02ccc1fcd854968087172d50cfcca2.tar.gz
minetest-f5706d444b02ccc1fcd854968087172d50cfcca2.tar.bz2
minetest-f5706d444b02ccc1fcd854968087172d50cfcca2.zip
Improve shadow rendering with non-default camera FOV (#11385)
* Adjust minimum filter radius for perspective * Expand shadow frustum when camera FOV changes, reuse FOV distance adjustment from numeric.cpp * Read shadow_soft_radius setting as float * Use adaptive filter radius to accomodate for PSM distortion * Adjust filter radius for texture resolution
Diffstat (limited to 'src/client/shadows')
-rw-r--r--src/client/shadows/dynamicshadows.cpp31
1 files changed, 18 insertions, 13 deletions
diff --git a/src/client/shadows/dynamicshadows.cpp b/src/client/shadows/dynamicshadows.cpp
index 775cdebce..17b711a61 100644
--- a/src/client/shadows/dynamicshadows.cpp
+++ b/src/client/shadows/dynamicshadows.cpp
@@ -33,29 +33,34 @@ void DirectionalLight::createSplitMatrices(const Camera *cam)
v3f newCenter;
v3f look = cam->getDirection();
+ // camera view tangents
+ float tanFovY = tanf(cam->getFovY() * 0.5f);
+ float tanFovX = tanf(cam->getFovX() * 0.5f);
+
+ // adjusted frustum boundaries
+ float sfNear = shadow_frustum.zNear;
+ float sfFar = adjustDist(shadow_frustum.zFar, cam->getFovY());
+
+ // adjusted camera positions
v3f camPos2 = cam->getPosition();
v3f camPos = v3f(camPos2.X - cam->getOffset().X * BS,
camPos2.Y - cam->getOffset().Y * BS,
camPos2.Z - cam->getOffset().Z * BS);
- camPos += look * shadow_frustum.zNear;
- camPos2 += look * shadow_frustum.zNear;
- float end = shadow_frustum.zNear + shadow_frustum.zFar;
- newCenter = camPos + look * (shadow_frustum.zNear + 0.05f * end);
- v3f world_center = camPos2 + look * (shadow_frustum.zNear + 0.05f * end);
- // Create a vector to the frustum far corner
- // @Liso: move all vars we can outside the loop.
- float tanFovY = tanf(cam->getFovY() * 0.5f);
- float tanFovX = tanf(cam->getFovX() * 0.5f);
+ camPos += look * sfNear;
+ camPos2 += look * sfNear;
- const v3f &viewUp = cam->getCameraNode()->getUpVector();
- // viewUp.normalize();
+ // center point of light frustum
+ float end = sfNear + sfFar;
+ newCenter = camPos + look * (sfNear + 0.05f * end);
+ v3f world_center = camPos2 + look * (sfNear + 0.05f * end);
+ // Create a vector to the frustum far corner
+ const v3f &viewUp = cam->getCameraNode()->getUpVector();
v3f viewRight = look.crossProduct(viewUp);
- // viewRight.normalize();
v3f farCorner = look + viewRight * tanFovX + viewUp * tanFovY;
// Compute the frustumBoundingSphere radius
- v3f boundVec = (camPos + farCorner * shadow_frustum.zFar) - newCenter;
+ v3f boundVec = (camPos + farCorner * sfFar) - newCenter;
radius = boundVec.getLength() * 2.0f;
// boundVec.getLength();
float vvolume = radius * 2.0f;