Directx 阴影贴图

Directx shadow mapping

我已经在我的引擎中成功实现了阴影贴图,但问题是阴影贴图没有覆盖整个场景。如果我使阴影贴图变大,阴影质量会下降。所以我试着让我的影子随着相机移动。如果我能计算出相机平截头体顶点的 8 个世界 space 位置,我就能做到这一点。

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

谢谢。

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

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

BoundingFrustum 文档: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