Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx阴影映射_Directx_Shadow - Fatal编程技术网

Directx阴影映射

Directx阴影映射,directx,shadow,Directx,Shadow,我已经在我的引擎中成功地实现了阴影贴图,但问题是阴影贴图没有覆盖整个场景。如果我使阴影贴图变大,阴影质量将下降。所以我试着用相机移动我的影子。如果我能计算相机平截头体顶点的8个世界空间位置,我就能做到这一点 那么,如何计算摄影机平截头体顶点的世界空间位置呢?我正在使用Directx,如果它改变了计算方式 谢谢。视锥体(近平面、远平面、fov)位于视图空间中,因此将其与逆视图矩阵相乘将其移动到世界空间中。如果使用DirectXMath(我建议使用),则可以使用边界平截头体对象。示例代码可能如下所示

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

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

谢谢。

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

DirectX::BoundingFrustum frustum;
DirectX::BoundingFrustum::CreateFromMatrix(frustum, camera.getProjectionMatrix());
DirectX::XMMATRIX inverseViewMatrix = DirectX::XMMatrixInverse(nullptr, camera.getViewMatrix());
frustum.Transform(frustum, inverseViewMatrix);
边界平截头体文档:

如果您的视锥很大,并且必须查看较大的区域(例如室外场景),那么即使是较大的移动阴影贴图也可能不够(或者需要大量内存)。解决此问题的一种技术称为级联阴影贴图(CSM)。在CSM中,在摄影机附近渲染更精确的阴影贴图,而在低质量始终不可见的距离渲染不太精确的阴影。如果您感兴趣,这里有一个CSM教程: