C++ 阴影贴图不';t使用世界空间转换(OpenGL)

C++ 阴影贴图不';t使用世界空间转换(OpenGL),c++,opengl,glsl,glm-math,shadow-mapping,C++,Opengl,Glsl,Glm Math,Shadow Mapping,我正试图在我用openGL创建的3D世界中实现阴影贴图。 我希望能够在地图上四处移动,并在移动时跟随阴影,因此我需要一个光线投影矩阵,该矩阵考虑了我的世界视图视锥 glm::mat4 lightProjectionMatrix = glm::ortho<float>(camera->_width * -0.5f, camera->_width * 0.5f,

我正试图在我用openGL创建的3D世界中实现阴影贴图。 我希望能够在地图上四处移动,并在移动时跟随阴影,因此我需要一个光线投影矩阵,该矩阵考虑了我的世界视图视锥

        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;
该比例将具有左手世界轴

现在我已经具备了所有这些,我应该能够拥有一个阴影纹理,其位置如下:

    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;
下面是结果。当我乘以光和世界矩阵时,我的值不在0和1之间。这就是我应该拥有的

请注意,当我不将地形与世界空间相乘时,我的地形正在正确渲染,阴影会出现,因为它们在0和1之间

所以我不明白为什么我的世界矩阵打破了这一点


有什么想法或建议吗?

当你转换到你的光空间时,你使用了一个已经转换的位置。 相反,您应该为cam和灯光变换使用原始顶点位置:

gl_Position = mvp * aPos;
shadowCoord = lightMvp * aPos; // DO NOT USE gl_Position;
需要注意的其他事项:

  • 写入时,生成的坐标范围为-1(近平面)到+1(远平面),而不是0..1
  • 按-1,1,1缩放看起来很可疑:如果你这样做,你会从右手坐标系变成左手坐标系。如果希望相机或灯光指向相反方向,请不要镜像一个轴,而是将其旋转180度
  • 在第一个代码片段中,您混合了
    深度
    前缀。复制粘贴错误
  • 你的远近价值观是什么

我不使用glm数学,因此我自己阅读和调试有点困难。下面是我遵循的教程,如果有帮助的话,它有一个详细的列表,列出了要根据逻辑检查的操作:
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
gl_Position = mvp * aPos;
shadowCoord = lightMvp * aPos; // DO NOT USE gl_Position;