![](/img/trans.png)
[英]directx11 Point light issue. Objects translated from the origin are not lit correctly
[英]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.