我在一个原有的OpenGL程序里面,想制加入物体的辉光效果,于是加入了FrameBufferObject,但是运行程序以后,除了按钮,其他地方都是黑的。
请大家帮我看看这些关于FBO的程序,是不是影响到了原来主程序中的mainFrameBuffer? 谢谢了。1.下面是原主程序中, Draw函数里面开始调用FBO 的代码:
GLenum err = glewInit() ;
if (GLEW_OK != err)
{
  MessageBoxA(NULL, "error", "My Window", 1) ;
}
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport( 0, 0, 1024, 768);glow.init();  //代码在下面
glow.begin();  //代码在下面
        
glPushMatrix(); // 绘制的一个球,打算让他有发光的效果
  glTranslatef(0.0, 0.0, 0.0);// 绘制的一个球,打算让他有发光的效果
  glutSolidSphere(5, 32, 32);// 绘制的一个球,打算让他有发光的效果
glPopMatrix();// 绘制的一个球,打算让他有发光的效果
      
glow.end();  //代码在下面
glPopAttrib();
2.glow.init();
initShaders(); //这和函数读调用了Shader的一些文件,用于制作物体的模糊。        fbo = new FrameBufferObject();        /************************************************************************/
        /* TEXTURE CREATION                                                     */
        /************************************************************************/
        glGenTextures(1, &originalTexture);
        glGenTextures(1, &brightPassTex);
        glGenTextures(1, &horizBlurredTex);
        glGenTextures(1, &finalBlurredTex);        glGenTextures(1, &depthBufferId);        // initialize depth buffer
        glBindTexture(GL_TEXTURE_2D, depthBufferId);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, imageWinWidth, imageWinHeight, 0,
                GL_DEPTH_COMPONENT, GL_FLOAT, NULL);        fbo->bind();
      glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glViewport( 0, 0, 1024, 768);        // initialize texture that will store the framebuffer image
        glBindTexture(GL_TEXTURE_2D, originalTexture);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
                GL_RGBA, GL_FLOAT, NULL);        glBindTexture(GL_TEXTURE_2D, brightPassTex);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
                GL_RGBA, GL_FLOAT, NULL);        glGenerateMipmapEXT(GL_TEXTURE_2D);        glBindTexture(GL_TEXTURE_2D, horizBlurredTex);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
                GL_RGBA, GL_FLOAT, NULL);        glGenerateMipmapEXT(GL_TEXTURE_2D);        glBindTexture(GL_TEXTURE_2D, finalBlurredTex);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWinWidth, imageWinHeight, 0,
                GL_RGBA, GL_FLOAT, NULL);        glGenerateMipmapEXT(GL_TEXTURE_2D);        fbo->attachTexture(originalTexture, GL_COLOR_ATTACHMENT0_EXT, 0);
        fbo->attachTexture(brightPassTex,   GL_COLOR_ATTACHMENT1_EXT, 0);
        
        fbo->attachTexture(horizBlurredTex, GL_COLOR_ATTACHMENT2_EXT, 0);
        fbo->attachTexture(finalBlurredTex, GL_COLOR_ATTACHMENT3_EXT, 0);        fbo->attachDepthBuffer( depthBufferId );        glPopAttrib();
        FrameBufferObject::unbind();
3.glow.begin();
fbo->bind();        glDrawBuffer( GL_COLOR_ATTACHMENT0_EXT );        // #### FIRST STEP: Draw the object into the original texture: 'originalTexture'
        glClearColor(0.0f, 0.0f, 0.0f, 1.0);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
4.glow.end(); 
glDrawBuffer( GL_COLOR_ATTACHMENT1_EXT );        // Don't forget to clean the COLOR/DEPTH buffers
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        // render using the horizontal blur shader and the original texture
        brightPassShaderProgram->useProgram();
                renderSceneOnQuad( originalTexture, GL_TEXTURE0);
        brightPassShaderProgram->disableProgram();        /************************************************************************/
        /* TEMP!!!!                                                                     */
        /************************************************************************/
        glBindTexture(GL_TEXTURE_2D, brightPassTex);
        glGenerateMipmapEXT(GL_TEXTURE_2D);        blurToMipmaps(GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, 6.0f, 0.03f);
        blurToMipmaps(GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT1_EXT, 3.0f, 0.005f);        /************************************************************************/
        /*                                                                      */
        /************************************************************************/
        glDrawBuffer( GL_COLOR_ATTACHMENT2_EXT );        // ******* RENDER TO THE WINDOW *************        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        glColor3f(1.0, 1.0, 1.0);        blenderShaderProgram->useProgram();
                blendTextures(brightPassTex, finalBlurredTex);
        blenderShaderProgram->disableProgram();        /************************************************************************/
        /*                                                                      */
        /************************************************************************/        // 'unbind' the FBO. things will now be drawn to screen as usual
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);        // ******* RENDER TO THE WINDOW *************        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        //************************************************************************/
        //* SHOULD FIND OUT THIS WELL !!!!                                       */
        //************************************************************************/
        glColor3f(1.0, 1.0, 1.0);        //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        blenderShaderProgram->useProgram();
                //renderSceneOnQuad( horizBlurredTex, GL_TEXTURE0 );
                blendTextures(originalTexture, horizBlurredTex);
        blenderShaderProgram->disableProgram();
另:加入FBO后,运行程序的效果如下。
背景都成黑的了。

解决方案 »

  1.   

    谢谢kingbyang1和fandh的回复。我在加入FBO之前,软件是这样的,如下图。  视角可以跑动,像CS一样。我加入了FBO以后,后面的球场都是黑的了,只有按钮可以显示。
    我加入FBO,主要是因为我想在球场里面加入一个自发光的球体,模拟灯泡。
    现在把自发光球体的代码写进去就出问题了。这个自发光球体是基于FBO 和 GLSL 的。
      

  2.   


    我在一个单独的程序里面实现了发光的球体,是基于FBO 和 GLSL 的。
    在这个程序里面有很多次的:
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);每次的清空场景,都是为了后面生成新的图片。  
    如果去掉glClearColor,那个自发光体也显示不出来了。
      

  3.   

    我把glClearColor全部注视掉了,背景里面的足球场还是不能显示,我只能看到我绘制的球体,但是也不会发光。请高手指点。