opengl shadow mapping shadow moves with camera

665 views Asked by At

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();
0

There are 0 answers