2012-11-20 49 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 –