Directx阴影映射

问题描述 投票:1回答:1

我已经在我的引擎中成功实现了阴影贴图,但问题是阴影贴图没有覆盖整个场景。如果我制作阴影贴图,则阴影质量会下降。所以我正在尝试用相机让我的阴影移动。如果我可以计算相机平截头体顶点的8个世界空间位置,我可以这样做。

那么如何计算相机截头顶点的世界空间位置呢?我正在使用Directx,如果它改变了它的计算方式。

谢谢。

directx shadow
1个回答
1
投票

平截头体(近平面,远平面,fov)在视图空间中,因此将其与逆视图矩阵相乘将其移动到世界空间中。如果您使用DirectXMath(我推荐),您可以使用边界平截头体对象。示例代码可能如下所示:

DirectX::BoundingFrustum frustum;
DirectX::BoundingFrustum::CreateFromMatrix(frustum, camera.getProjectionMatrix());
DirectX::XMMATRIX inverseViewMatrix = DirectX::XMMatrixInverse(nullptr, camera.getViewMatrix());
frustum.Transform(frustum, inverseViewMatrix);

BoundingFrustum docs:https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.directxmath.boundingfrustum(v=vs.85).aspx

如果您的视锥体很大并且您必须查看大面积(例如室外场景),那么即使是大的移动阴影贴图也可能不够(或者需要大量的内存)。解决此问题的一种技术称为级联阴影贴图(CSM)。在CSM中,更精确的阴影贴图渲染在相机附近,并且在低质量无论如何都不可见的距离内渲染不太精确的阴影。如果您有兴趣,请参阅CSM教程:https://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx

© www.soinside.com 2019 - 2024. All rights reserved.