簡體   English   中英

陰影 map 不適用於世界空間變換 (OpenGL)

[英]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;

其他需要注意的事項:

  • 結果坐標的范圍從-1(近平面)到+1(遠平面)而不是你寫的0..1。
  • -1,1,1 的縮放看起來很可疑:如果你這樣做,你 go 從右手坐標系到左手坐標系。 如果您希望您的相機或燈光指向相反的方向,請不要鏡像一個軸,而是將其旋轉 180 度。
  • 在您的第一個片段中,您將depthlight前綴混合在一起。 復制N粘貼錯誤?
  • 你的 NEAR 和 FAR 值是多少?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM