【问题标题】:Trailing shadows in Shadow Map阴影贴图中的尾随阴影
【发布时间】:2012-11-21 07:45:13
【问题描述】:

我已经创建了阴影贴图。但是它有两个问题: 1.阴影只有在我改变模型矩阵时才会出现。即最初没有阴影,但是当我按下一个键来移动图形时,即模型矩阵发生了变化,就会出现阴影。 2. 帧缓冲区的纹理上有一条旧渲染的痕迹,导致拖尾很长。

任何人都可以对此有所了解吗?

这是问题的截图

在此处编辑代码:

void generateShadowTex()
{
        //Calculate final ligting properties
    glm::vec4 a_f=light_ambient*mat_ambient;
    glm::vec4 d_f=light_diffuse*mat_diffuse;
    glm::vec4 s_f=light_specular*mat_specular;
    int counter=0;
    glClear(GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST);    // need depth test to correctly draw 3D objects 
    glClearColor(0,0,0,1); 
    //glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    if(wframe)
        glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
    else
        glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 

    glActiveTexture(GL_TEXTURE3);
    glBindTexture(GL_TEXTURE_2D,depthTex);

        // MAths here for mvp manupulation 
        //Draw Elements
        if(a<17 || a==18)
            glDrawElements(GL_QUADS, masterNumberIndices[a], GL_UNSIGNED_INT, (char*) NULL+0);
        else
            glDrawElements(GL_TRIANGLES, masterNumberIndices[a], GL_UNSIGNED_INT, (char*) NULL+0);

        glBindVertexArrayAPPLE(0);

    }
    glUseProgram(0);  

}

void Init_FBO() 
{ 
    GLfloat border[] = {1.0f, 0.0f, 0.0f, 0.0f};  

    //glActiveTexture(GL_TEXTURE3);
    glGenTextures(1, &depthTex);  
    glBindTexture(GL_TEXTURE_2D, depthTex);  
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24,900,900, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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);  
    glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
    glBindTexture(GL_TEXTURE_2D,0); 

    glGenFramebuffers(1, &shadowFBO);  
    glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);  
    glDrawBuffer(GL_NONE);  
    glReadBuffer(GL_NONE);  
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);  
    glBindFramebuffer(GL_FRAMEBUFFER, 0); // go back to the default framebuffer  
    // check FBO status 
    GLenum FBOstatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 
    if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) 
    {
        printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO\n");
    }
    else
    {
        printf("Frame Buffer Done Succesfully\n");
    } 
}


void display() 
{
    glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO); 
    generateShadowTex(); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    generateScene(); 
}

【问题讨论】:

  • 显然您在某个阶段做错了一些数学运算,但我不确定您认为我们如何在没有看到您的代码的情况下提供帮助。
  • @Tim:仅供参考:如果有人没有提供足够的信息来回答它,那么您应该投票以“不是真正的问题”来结束他们的问题。
  • @Tim :我已经编辑了问题以添加代码的相关部分.....
  • @NicolBolas :我不确定会询问什么样的信息,因此我认为我会根据需要粘贴它。那是我的愚蠢。我提供了我认为可能有帮助的信息

标签: opengl glsl


【解决方案1】:

您需要在清除深度缓冲区之前启用它。来自 OpenGL 规范:

如果缓冲区不存在,则指向该缓冲区的 glClear 无效。 1

还有:

GL_DEPTH_TEST

如果启用,进行深度比较并更新深度缓冲区。请注意,即使深度缓冲区存在且深度掩码不为零,如果禁用深度测试,深度缓冲区也不会更新。 2

至于你问题的第一部分,我只能猜测问题可能是什么,但你可能没有正确初始化模型矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多