This is what i made of that code
glm::mat4 Game::getDirLightVPMatrix()
{
glm::mat4 lvMatrix = glm::lookAt(-glm::normalize(lightDir), glm::vec3(0.0f), glm::vec3(1.0f));
glm::mat4 CameraViewToLight = glm::inverse(view) * lvMatrix;
const float ScaleXInv = 1.0f / projection[0][0];
const float ScaleYInv = 1.0f / projection[1][1];
std::vector<glm::vec3> CornersVS;
CornersVS.reserve(8);
const float NearX = ScaleXInv * near;
const float NearY = ScaleYInv * near;
CornersVS.push_back(glm::vec3(-NearX, +NearY, near));
CornersVS.push_back(glm::vec3(+NearX, +NearY, near));
CornersVS.push_back(glm::vec3(+NearX, -NearY, near));
CornersVS.push_back(glm::vec3(-NearX, -NearY, near));
const float FarX = ScaleXInv * far;
const float FarY = ScaleYInv * far;
CornersVS.push_back(glm::vec3(-FarX, +FarY, far));
CornersVS.push_back(glm::vec3(+FarX, +FarY, far));
CornersVS.push_back(glm::vec3(+FarX, -FarY, far));
CornersVS.push_back(glm::vec3(-FarX, -FarY, far));
glm::vec4 transf = CameraViewToLight * glm::vec4(CornersVS[0], 1.0);
float minZ = transf.z;
float maxZ = transf.z;
float minX = transf.x;
float maxX = transf.x;
float minY = transf.y;
float maxY = transf.y;
for (unsigned int i = 1; i < 8; i++)
{
transf = CameraViewToLight * glm::vec4(CornersVS[i], 1.0f);
if (transf.z > maxZ) maxZ = transf.z;
if (transf.z < minZ) minZ = transf.z;
if (transf.x > maxX) maxX = transf.x;
if (transf.x < minX) minX = transf.x;
if (transf.y > maxY) maxY = transf.y;
if (transf.y < minY) minY = transf.y;
}
glm::mat4 lpMatrix = glm::ortho(minX, maxX, minY, maxY, minZ, maxZ);
return lpMatrix * lvMatrix;
}
it does work, and it does generate a different shadow map, but it suffers from very similar problem