[英]Shadow map doesn't work with world space transformation (OpenGL)
我正在嘗試在我用 openGL 創建的 3D 世界中實現陰影貼圖。 我希望能夠在 map 周圍移動,並在我移動時跟隨陰影,所以我需要一個考慮到我的世界觀視錐體的光投影矩陣。
glm::mat4 lightProjectionMatrix = glm::ortho<float>(camera->_width * -0.5f, camera->_width * 0.5f,
camera->_height * -0.5f, camera->_height * 0.5f,
camera->_deep * -0.5f, camera->_deep * 0.5f);
glm::mat4 lightViewMatrix = glm::lookAt(camera->_centroid, camera->_centroid + glm::vec3(-1, -1, 0) , glm::vec3(0, 1, 0));
glm::mat4 lightModelMatrix = glm::mat4(1.0);
glm::mat4 lightMvp = depthProjectionMatrix * depthViewMatrix * depthModelMatrix;
寬度、高度、深度和質心變量來自光的正交投影的長方體。 為了獲得它,我使用了我的世界相機平截頭角,將它們旋轉到光空間中進行計算。 一旦我將長方體的質心和維度轉換為光空間,我將它們轉換回世界空間。
這是我的世界投影矩陣
_projection = glm::perspective(glm::radians(_fov), _screenRatio, _near, _far);
_projection = glm::scale(_projection, glm::vec3(-1, 1, 1));
_view = glm::lookAt(_cameraPos, _cameraPos + _dirLook, _cameraUp);
_mvp = _projection * _view;
規模是有一個左手世界軸。
現在我已經擁有了所有我應該能夠擁有位置如下的陰影紋理:
gl_Position = mvp * aPos;
shadowCoord = lightMvp * gl_Position;
但是,我的影子沒有出現。 所以我打印了一些測試用例來看看有什么問題:
auto pos = glm::vec3(50, 50, 300);
auto worldPos = _mvp * glm::vec4(pos, 1);
auto Light = lightMvp * glm::vec4(pos, 1);
auto worldLight = lightMvp * worldPos;
auto worldViewLight = lightMvp * _view * glm::vec4(pos, 1);
std::cout << "-----------" << std::endl;
std::cout << "worldPos = " << worldPos.x << " " << worldPos.y << " " << worldPos.z << std::endl;
std::cout << "Light = " << Light.x << " " << Light.y << " " << Light.z << std::endl;
std::cout << "worldLight = " << worldLight.x << " " << worldLight.y << " " << worldLight.z << std::endl;
std::cout << "worldViewLight = " << worldViewLight.x << " " << worldViewLight.y << " " << worldViewLight.z << std::endl;
worldPos = -194.856 -346.41 302.806
Light = 0.621941 0 0.177444
worldLight = 268.828 -0.0950791 67.447
worldViewLight = 1.15693 -0.250944 0.221805
這是結果。 當我乘以光和世界矩陣時,我沒有介於 0 和 1 之間的值。這就是我應該擁有的。
請注意,當我不將它們與世界空間相乘時,我的地形會正確渲染,並且會出現陰影,因為它們介於 0 和 1 之間。
所以我不明白為什么我的世界矩陣會破壞它。
有什么想法或建議嗎?
當你轉換到你的光空間時,你使用了一個已經轉換的 position。 相反,您應該將原始頂點位置用於凸輪和燈光變換:
gl_Position = mvp * aPos;
shadowCoord = lightMvp * aPos; // DO NOT USE gl_Position;
其他需要注意的事項:
depth
和light
前綴混合在一起。 復制N粘貼錯誤?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.