2012-11-21 19 views
1

我已經創建了陰影貼圖。但是它有兩個問題: 1.只有當我更改模型矩陣時,陰影纔會顯示出來。即最初沒有陰影,但是當我按下某個鍵移動圖形時,即模型矩陣發生了變化,陰影就會出現。 2. framebuffer上的紋理上有一些舊的渲染線索,導致漫長的線索。Shadow Map中的尾部陰影

任何人都可以對此有所瞭解嗎?

這是問題 enter image description here

編輯代碼下面的截圖:

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(); 
} 
+1

顯然你在某個階段做了一些錯誤的數學計算,雖然我不確定你怎麼看我們沒有看到你的代碼就可以提供幫助。 – Tim

+0

@Tim:供參考:如果有人沒有提供足夠的信息來回答它,那麼你應該投票結束他們的問題爲「不是真正的問題」。 –

+0

@Tim:我編輯了這個問題來添加代碼的相關部分..... –

回答

0

您需要你清楚它啓用深度緩衝。從OpenGL規範:

如果緩衝區不存在,則指向該緩衝區的glClear不起作用。 1

和:

GL_DEPTH_TEST

如果啓用,做深入的比較和更新深度緩存。請注意,即使深度緩衝區存在且深度遮罩不爲零,如果深度測試已禁用,深度緩衝區也不會更新。 2

至於你的問題的第一部分,我只能猜測問題可能是什麼,但你可能不正確地初始化模型矩陣。