Got it working
from stackoverflow/ questions/33499053/cascaded-shadow-map-shimmering
#include "Graphics/ShadowMap.hpp"
#include "Core/Log.hpp"
#include "Graphics/Skybox.hpp"
#include "glm/ext/matrix_float4x4.hpp"
#include "glm/ext/matrix_transform.hpp"
#include "glm/ext/matrix_clip_space.hpp"
#include "glm/ext/vector_float3.hpp"
#include "glm/geometric.hpp"
#include <cmath>
using namespace PhantomEngine;
void ShadowMap::Init(){
glGenFramebuffers(1,&ShadowmapFBO);
glGenTextures(1, &ID);
glBindTexture(GL_TEXTURE_2D, ID);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,ShadowMapReslotion,ShadowMapReslotion,0,GL_DEPTH_COMPONENT,GL_FLOAT,nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_BORDER);
float clampColor[] = {1, 1, 1, 1};
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, clampColor);
glBindFramebuffer(GL_FRAMEBUFFER, ShadowmapFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,ID,0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void ShadowMap::Bind(glm::mat4& view){
Corners = GetFrustomCornersWS(CameraProjection,view);
UpdateCenter();
ShadowDirection = glm::normalize(ShadowDirection);
glm::vec3 up = glm::vec3(0,1,0);
glm::mat4 ShadowView = glm::lookAt(center-ShadowDirection, center,up);
float radius = glm::length(center - glm::vec3(Corners[6]));
for (uint i = 0;i<8;i++) {
float distance = glm::length(center-glm::vec3(Corners[i]));
radius = glm::max(radius,distance);
}
radius = std::ceil(radius);
glm::vec3 minBox = center-glm::vec3(radius);
glm::vec3 maxBox = center+glm::vec3(radius);
minBox = glm::vec3(ShadowView*glm::vec4(minBox,1.0f));
maxBox = glm::vec3(ShadowView*glm::vec4(maxBox,1.0f));
float near = minBox.z;
float far = maxBox.z;
glm::mat4 ShadowOrtho = glm::ortho(minBox.x,maxBox.x,minBox.y,maxBox.y,near,far);
//shadowmatix, kinda?
glm::mat4 SMatrix = ShadowOrtho * ShadowView;
glm::vec4 ShadowOrigin = glm::vec4(0,0,0,1);
ShadowOrigin = SMatrix*ShadowOrigin;
ShadowOrigin = ShadowOrigin*(float)ShadowMapReslotion/2.0f;
glm::vec4 roundedOrigin = glm::round(ShadowOrigin);
glm::vec4 roundedOffset = roundedOrigin-ShadowOrigin;
roundedOffset = roundedOffset * 2.0f/(float)ShadowMapReslotion;
roundedOffset.z = 0;
roundedOffset.w = 0;
glm::mat4 ShadowProj = ShadowOrtho;
ShadowProj[3] +=roundedOffset;
ShadowOrtho = ShadowProj;
ShadowMatrix = ShadowOrtho * ShadowView;
glEnable(GL_DEPTH_TEST);
glViewport(0,0,ShadowMapReslotion,ShadowMapReslotion);
glBindFramebuffer(GL_FRAMEBUFFER, ShadowmapFBO);
glClear(GL_DEPTH_BUFFER_BIT);
glCullFace(GL_FRONT);
}
void ShadowMap::UpdatePreojection(float FOV,float Aspect){
CameraProjection = glm::mat4(1.0f);
CameraProjection = glm::perspective(glm::radians(FOV),Aspect, 0.01f,ShadowDistance);
}
void ShadowMap::ActiveTexture(){
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0+1);
glBindTexture(GL_TEXTURE_2D, ID);
};