DirectX 11 - 点光源阴影

3
我正在尝试在DirectX 11中使用立方体阴影贴图来实现点光源阴影,但我遇到了困难。我已经搜索了一些相关的教程,但这些教程大多是针对OpenGL或较早版本的DirectX。我使用CreateTexture2D(),CreateDepthStencilView()和CreateShaderResourceView()函数设置了一个阴影贴图纹理,其中在可能的情况下使用了TextureCube标志。然而,我不确定如何为立方体贴图的每个面添加不同的“相机”位置,并计算视图/投影矩阵。我当前已经实现了聚光灯/定向灯的阴影,但我以前从未使用过立方体贴图。我需要一些指引来帮助我开始。非常感谢您的帮助。
编辑:我目前有一个D3D11_TEXTURE2D_DESC变量,将阴影纹理创建为TEXTURECUBE;使用D3D11_DEPTH_STENCIL_VIEW_DESC创建了深度模板缓冲区,并使用D3D11_SHADER_RESOURCE_VIEW_DESC创建了一个着色器资源视图。我希望这样就创建了立方体贴图纹理。但我不确定如何使用视图/投影矩阵初始化它的每个面,然后将其传递给顶点或几何着色器。非常感谢您的帮助。
1个回答

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);
}

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

感谢您的回复。我是一个DirectX 11的新手,Cubemap纹理对我来说是一个新概念,我正在努力理解它。我不确定如何为每个立方体面的每个视图/投影创建矩阵,并在着色器之间传递它。目前,我只有一个从光源角度传递到顶点着色器的视图/投影矩阵通过常量缓冲区,而阴影纹理则使用PSSetShaderResources()传递到着色器中。 - Jonathan
哦,你一次只渲染一个立方体贴图面。因此,你只需要为一个渲染通道使用单个视图/投影矩阵。但是你必须为每个面进行六次渲染通道(每个面一次)。上面我描述了每个面所需的视图参数(位置方向上)和投影参数(宽高比,视野)。 - Felix Brüll
我现在遇到的问题是,我不知道从哪里开始入手,而且我刚刚学会如何使用几何着色器。似乎在dx11中关于立方体贴图和点光源阴影的资料非常有限。虽然感谢你的帮助。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接