绘制渲染缓冲区对象的内容

Jav*_*rez 3 opengl fbo

不太了解操作渲染缓冲区对象.例如,如果我想显示渲染缓冲区中的内容,我必须将渲染渲染到纹理?

    GLuint fbo,color_rbo,depth_rbo;

    glGenFramebuffers(1,&fbo);
    glBindFramebuffer(GL_FRAMEBUFFER,fbo);

    glGenRenderbuffersEXT(1, &color_rb);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, color_rb);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, 256, 256);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,GL_RENDERBUFFER_EXT, color_rb);

    glGenRenderbuffersEXT(1, &depth_rb);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 256, 256);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, depth_rb);

    if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)!=GL_FRAMEBUFFER_COMPLETE_EXT)return 1;

    glBindFramebuffer(GL_FRAMEBUFFER,0);

    //main loop    

    //This does not work :-(
    glBindFramebuffer(GL_FRAMEBUFFER,fbo);
    glClearColor(0.0,0.0,0.0,1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    drawCube();
    glBindFramebuffer(GL_FRAMEBUFFER,0);
Run Code Online (Sandbox Code Playgroud)

任何的想法?

And*_*man 11

当你绘制到FBO而不是默认的帧缓冲区时,你不会看到任何东西,这是FBO的一部分.

你的选择是:

  1. GL_BACKrenderbuffer blit 到另一个framebuffer中(在这种情况下,它可能是默认的backbuffer)

  2. 如果要查看结果,请绘制到纹理附件中,然后绘制纹理映射的图元(例如三角形/四边形).

由于2是不言自明的,我将更详细地解释选项1:

/* We are going to blit into the window (default framebuffer)                     */
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
glDrawBuffer      (GL_BACK);              /* Use backbuffer as color dst.         */

/* Read from your FBO */
glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo);
glReadBuffer      (GL_COLOR_ATTACHMENT0); /* Use Color Attachment 0 as color src. */

/* Copy the color and depth buffer from your FBO to the default framebuffer       */
glBlitFramebuffer (0,0, width,height,
                   0,0, width,height,
                   GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
                   GL_NEAREST);
Run Code Online (Sandbox Code Playgroud)

这里有一些值得一提的事情:

首先,从一个帧缓冲到另一个帧缓冲的blitting通常比绘制填充整个视口的两个纹理三角形慢得多.其次,当您对深度或模板图像进行blit时,不能使用线性过滤...但是如果采用纹理映射方法,则可以使用(这只有在blitting时源和目标缓冲区的分辨率不同才真正重要).

总的来说,绘制纹理基元是更灵活的解决方案.如果你需要进行多重采样抗锯齿,Blitting是最有用的,因为你必须在着色器中实现它,否则 Framebuffer Objects 之后添加多重采样纹理; 一些较旧的硬件/驱动程序支持FBO,但不支持多重采样颜色(需要DX10硬件)或深度(需要DX10.1硬件)纹理.