2012-11-20 52 views
1

我想要做基於OpenGL GLSL的陰影映射。麻煩的是,當我完成渲染陰影貼圖後,我將地圖渲染到屏幕上以測試渲染是否正確工作,即,我只是將新生成的貼圖用作映射到屏幕上的貼圖。預期的結果是我會看到新的紋理。但是,我所看到的是一個白色區域,其紋理繪製得非常微弱。也就是說,如果我將屏幕傾斜一定的角度,那麼我可以看到陰影貼圖的微弱輪廓。陰影映射是微弱的

任何人都可以告訴我,如果我做錯了什麼嗎?

這裏是我的代碼相關部分:

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

     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 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; 
     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); 
     glClear(GL_DEPTH_BUFFER_BIT); 
     glCullFace(GL_FRONT); 
     if(wframe) 
      glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
     else 
      glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 


     glUseProgram(programObject); 
     //Draw the stuff using Light Position as camera 
     //glutSwapBuffers(); 
     glActiveTexture(GL_TEXTURE3); 
     glBindTexture(GL_TEXTURE_2D,depthTex); 
     glUseProgram(0); 

    } 

void generateScene() 
{ 
     //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; 
    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); 

    //Draw the stuff using camera as camera position 

    } 
    glutSwapBuffers(); 
    glUseProgram(0); 

} 



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

我對不起,但這是*方式*太多的代碼要通過。你可以把這個簡單的例子提煉出來嗎? –

+0

@NicolBolas:編輯出不相關的代碼部分 –

回答

1

你的深度紋理正在通常,深度由近到遠剪輯平面覆蓋範圍,您可以使用設置一些合理的裁剪平面glFrustumf(...)

+0

是的,謝謝你,那就是問題.....我已經在飛機上標記爲0.01f,遠飛機標記爲10f ...將它改爲10f和500f解決了這個問題。非常感謝Mr.Activation Cloud –