DirectX 11-点光源阴影

时间:2019-12-30 22:57:32

标签: c++ directx hlsl shadowing

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

1 个答案:

答案 0 :(得分:0)

对于每个点光源,应按以下方式渲染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);
}

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