I have my shadow showing, only if I enter my scene and adjust my camera view in the scene. But it doesn't make sense because the shadow should only change or move if the light source moves, in my case the shadows move if I change my camera view.
However the shadow shapes are mapping rightly, the positions are odd and wrong, and I am pretty sure I'm not passing camera view as the light view when I render the scene from the light view
here's how I set up the first pass uniforms
void Renderer::setShadowUniform(GLuint program_id)
{
glUseProgram(program_id);
auto light_vec = vec3(data.directional * 30.0f);
Matrices.light_view = glm::lookAt(light_vec, vec3(1.0f), vec3(0.0f, 1.0f, 0.0f));
Matrices.light_proj = Matrices.projection;
GlobalUniformLocations.light_projc = glGetUniformLocation(program_id, "light_proj");
GlobalUniformLocations.light_view = glGetUniformLocation(program_id, "light_view");
glUniformMatrix4fv(GlobalUniformLocations.light_view, 1, GL_FALSE, &Matrices.light_view[0][0]);
glUniformMatrix4fv(GlobalUniformLocations.light_projc, 1, GL_FALSE, &Matrices.light_proj[0][0]);
}
here's the place I set the uniforms when I render the scene
void Renderer::setNormalRenderUniform(GLuint program_id)
{
glUseProgram(program_id);
//view related uniforms
auto light_vec = vec3(data.directional * 30.0f);
Matrices.light_view = glm::lookAt(light_vec, vec3(1.0f), vec3(0.0f, 1.0f, 0.0f));
Matrices.light_proj = Matrices.projection;
//Matrices.light_proj = glm::ortho<float>(-20,20,-20,20,-20,40);
Matrices.world_view = cams[0]->GetWorldToViewMat();
GlobalUniformLocations.eye = glGetUniformLocation(program_id, "camera_position");
GlobalUniformLocations.projection = glGetUniformLocation(program_id, "projection");
GlobalUniformLocations.world_view = glGetUniformLocation(program_id, "world_view");
glUniformMatrix4fv(GlobalUniformLocations.world_view, 1, GL_FALSE, &Matrices.world_view[0][0]);
glUniformMatrix4fv(GlobalUniformLocations.projection, 1, GL_FALSE, &Matrices.projection[0][0]);
glUniform3fv(GlobalUniformLocations.eye, 1, &cams[0]->position.x);
//shadow related uniforms
GlobalUniformLocations.shadow_map = glGetUniformLocation(program_id, "shadow_map");
GlobalUniformLocations.biased_matrix = glGetUniformLocation(program_id, "biased_mat");
GlobalUniformLocations.light_projc = glGetUniformLocation(program_id, "light_proj");
GlobalUniformLocations.light_view = glGetUniformLocation(program_id, "light_view");
glUniformMatrix4fv(GlobalUniformLocations.biased_matrix, 1, GL_FALSE, &Matrices.biased_matrix[0][0]);
glUniformMatrix4fv(GlobalUniformLocations.light_view, 1, GL_FALSE, &Matrices.light_view[0][0]);
glUniformMatrix4fv(GlobalUniformLocations.light_projc, 1, GL_FALSE, &Matrices.light_proj[0][0]);
//vertex color
GlobalUniformLocations.enable_vertex_color = glGetUniformLocation(program_id, "vertex_color_on");
//texture related uniforms
GlobalUniformLocations.texture = glGetUniformLocation(program_id, "textSample");
}
it's my paintGL method where I draw everything
glBindFramebuffer(GL_FRAMEBUFFER, renderer->depth_framebuffer_id);
glViewport(0, 0, DEPTH_TEXTURE_WIDTH, DEPTH_TEXTURE_HEIGHT);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glClearDepth(1.0f);
glCullFace(GL_FRONT);
glEnable(GL_DEPTH_TEST);
renderer->setShadowUniform(renderer->shaders[0]->program_id);
renderer->Draw();
////render scene
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, width(), height());
glDisable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glCullFace(GL_BACK);
glActiveTexture(GL_TEXTURE0 + renderer->depth_texture_id);
glBindTexture(GL_TEXTURE_2D, renderer->depth_texture_id);
glUniform1i(renderer->GlobalUniformLocations.shadow_map, renderer->depth_texture_id);
renderer->setNormalRenderUniform(renderer->shaders[1]->program_id);
renderer->Draw();