代码之家  ›  专栏  ›  技术社区  ›  IAS0601

Directx阴影映射

  •  1
  • IAS0601  · 技术社区  · 7 年前

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

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

    谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   jparimaa    7 年前

    视锥(近平面、远平面、fov)位于视图空间中,因此将其与反向视图矩阵相乘将将其移动到世界空间中。如果使用DirectXMath(我建议使用),则可以使用边界截锥对象。示例代码可能如下所示:

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

    边界平截头体文档: 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