C++ DirectX 11-点光源阴影

C++ DirectX 11-点光源阴影,c++,mapping,directx,hlsl,shadowing,C++,Mapping,Directx,Hlsl,Shadowing,我正在努力使用DirectX 11中的立方体阴影贴图实现点光源阴影。我到处搜索,似乎只有OpenGL或DirectX早期版本的教程。我已经使用CreateTexture2D()、CreateDepthStencilView()和CreateShaderResourceView()设置了阴影贴图纹理,并尽可能使用TextureCube标志。然后,我不确定如何为立方体地图的每个面添加不同的“摄影机”位置,以及如何计算视图/投影矩阵。我目前有阴影用于聚光灯/平行光,但我以前从未使用过立方体贴图。我只是

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


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

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

开关(faceId)
{
案例0:
//对
返回glm::vec3(1.0f,0.0f,0.0f);
案例1:
//左
返回glm::vec3(-1.0f,0.0f,0.0f);
案例2:
//向上
返回glm::vec3(0.0f、1.0f、0.0f);
案例3:
//向下
返回glm::vec3(0.0f,-1.0f,0.0f);
案例4:
//正面
返回glm::vec3(0.0f,0.0f,1.0f);
案例5:
//背
返回glm::vec3(0.0f,0.0f,-1.0f);//确定
}
对于摄影机上方向向量:

开关(faceId)
{
案例0:
案例1:
案例4:
案例5:
返回glm::vec3(0.0f、1.0f、0.0f);
案例2:
返回glm::vec3(0.0f,0.0f,-1.0f);
案例3:
返回glm::vec3(0.0f,0.0f,1.0f);
}

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

感谢您的回复。我是DirectX 11的新手,立方体贴图纹理对我来说是一个新概念,我正在绞尽脑汁去理解它。我不确定如何为立方体每个面的每个视图/投影创建矩阵,并在着色器之间传递矩阵。我目前只有一个来自灯光透视的视图/投影矩阵通过常量缓冲区传递到顶点着色器,阴影纹理使用PSSetShaderResources()传递到着色器。哦,一次只能渲染到单个立方体贴图面。因此,对于一个渲染过程,您只需要一个视图/投影矩阵。但必须执行六次渲染过程(每个面一次)。上面我描述了每个面的视图(位置方向向上)和投影(纵横比,fov)所需的参数我遇到的问题是我不知道从哪里开始,我刚刚学会了如何使用几何体着色器。对于dx11中的立方体贴图以及如何使用点光源进行阴影,似乎资源有限。谢谢你的帮助