繁体   English   中英

DirectX 11 - 点光阴影

[英]DirectX 11 - Point light shadowing

我正在努力在 DirectX 11 中使用立方体阴影贴图来实现点光源阴影。我四处搜索,似乎只有 OpenGL 或更早版本的 DirectX 中的教程。 在可能的情况下,我使用 CreateTexture2D()、CreateDepthStencilView() 和 CreateShaderResourceView() 设置了阴影贴图纹理。 然后我不确定如何为立方体贴图的每个面添加不同的“相机”位置以及如何计算视图/投影矩阵。 我目前有适用于聚光灯/平行光的阴影,但我以前从未使用过立方体贴图。 我只需要一些东西让我开始。 先感谢您。

编辑:我目前有一个 D3D11_TEXTURE2D_DESC 变量来创建阴影纹理作为 TEXTURECUBE; 深度模板已使用 D3D11_DEPTH_STENCIL_VIEW_DESC 创建,着色器资源视图已使用 D3D11_SHADER_RESOURCE_VIEW_DESC 创建。 我希望他已经创建了立方体贴图纹理。 我不确定如何使用每个面的视图/投影矩阵对其进行初始化,然后将其传递给顶点或可能的几何着色器。 任何帮助深表感谢。

对于每个点光源,您应该按如下方式渲染 6 个立方体贴图面:相机的位置就是点光源的位置。 您应该使用具有方面 1 和 90 度视野的透视投影。 相机的方向取决于您正在渲染的立方体贴图面。 我是这样用的:

switch (faceId)
{
case 0:
    // right
    return glm::vec3(1.0f, 0.0f, 0.0f);
case 1:
    // left
    return glm::vec3(-1.0f, 0.0f, 0.0f);
case 2:
    // up
    return glm::vec3(0.0f, 1.0f, 0.0f);
case 3:
    // down
    return glm::vec3(0.0f, -1.0f, 0.0f);
case 4:
    // front
    return glm::vec3(0.0f, 0.0f, 1.0f);
case 5:
    // back 
    return glm::vec3(0.0f, 0.0f, -1.0f); // ok
}

对于相机向上矢量:

switch (faceId)
{
case 0:
case 1:
case 4:
case 5:
    return glm::vec3(0.0f, 1.0f, 0.0f);
case 2:
    return glm::vec3(0.0f, 0.0f, -1.0f);
case 3:
    return glm::vec3(0.0f, 0.0f, 1.0f);
}

我还建议从着色器中写入线性深度。 这将使影子测试容易得多。 对于阴影贴图,只需使用立方体贴图采样器的点光源方向并比较(线性)距离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM