2016-10-17 83 views
0

你好,我正在尝试在openGL中使用C++实现阴影。 我创建了一个FrameBuffer和DepthTexture。每一帧I m rendering my entities to the FrameBuffer. For now I m只是像其他任何GUI一样在屏幕上显示纹理,但纹理完全是白色,并且在移动相机时不会改变。我希望你能帮我找到问题。从FrameBuffer渲染DepthTexture

我的代码:



    //Creating FrameBuffer + Texture 
    glGenFramebuffers(1, &depthMapFBO); 
    glGenTextures(1, &depthMap); 
    glBindTexture(GL_TEXTURE_2D, depthMap); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 
    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_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthMap, 0); 
    glDrawBuffer(GL_NONE); 
    glReadBuffer(GL_NONE); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

在渲染:



    glm::mat4 lightSpaceMatrix = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, Camera::ZNEAR, Camera::ZFAR) * glm::lookAt(m_position, m_position + m_forward, m_up); 
    m_shader.Bind(); 
    m_shader.loadMat4("lightSpaceMatrix", lightSpaceMatrix); 

    //Bind the FrameBuffer 
    glViewport(0, 0, m_width, m_height); 
    glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 
    glClear(GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); 

    //Render all Entitys 
    for (auto entity : m_entitys) { 
     m_shader.loadMat4("model", entity->getTransform()->getModel()); 
     entity->getTexturedModel()->getMesh()->Draw(); 
    } 

    //Unbind the FrameBuffer 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    glViewport(0, 0, Setting::width, Setting::height); 
    m_shader.unbind(); 

我的顶点着色器:



    #version 430 
    in layout(location=0) vec3 position; 
    uniform mat4 lightSpaceMatrix; 
    uniform mat4 model; 

    void main() 
    { 
     gl_Position = lightSpaceMatrix * model * vec4(position, 1.0f); 
    } 

我的片段着色器:



    #version 430 
    void main() 
    { 
     gl_FragColor = vec4(1); 
    } 

+2

您希望用'gl_FragColor = vec4(1);'显示什么颜色? – mlkn

+0

因为我没有颜色附件,所以我认为片段着色器中发生了什么并不重要,所以我只是将gl_FragColor设置为vec4(1) – Philipp98

+0

您是否试图通过该投影矩阵正常渲染场景?也许没有任何东西会被写入,并且你只是在深度缓冲区中清除全部白色。另外,你有没有正确的glDepthFunc? – mlkn

回答

0

使用我的正常投影矩阵,而不是正确的矩阵它工作得很好。所以我尝试了一下,当我创建了正交矩阵时,近平面和远平面被设置为0。我修好了,现在正在工作。感谢您的帮助。

相关问题