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

Opengl 绘制渲染缓冲区对象的内容,opengl,fbo,Opengl,Fbo,不太了解渲染缓冲区对象的操作。例如,如果我想显示渲染缓冲区中的内容,我必须执行渲染到纹理 GLuint fbo,color_rbo,depth_rbo; glGenFramebuffers(1,&fbo); glBindFramebuffer(GL_FRAMEBUFFER,fbo); glGenRenderbuffersEXT(1, &color_rb); glBindRenderbufferEXT(GL_RENDERBUFFER_EX

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

    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);

有什么想法吗?

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

你的选择是:
  • b将renderbuffer插入另一个帧缓冲区(在这种情况下,默认的backbuffer可能是
    GL_BACK

  • 如果要查看结果,请绘制到纹理附件中,然后绘制纹理贴图基本体(例如三角形/四边形)

  • 由于第2个选项是不言自明的,因此我将更详细地解释选项1:
    /*我们将进入窗口(默认帧缓冲区)*/
    glBindFramebuffer(GL\u DRAW\u FRAMEBUFFER,0);
    glDrawBuffer(GL_BACK);/*使用backbuffer作为颜色dst*/
    /*从你的FBO那里读*/
    glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo);
    glReadBuffer(GL_COLOR_ATTACHMENT0);/*使用颜色附件0作为颜色src*/
    /*将颜色和深度缓冲区从FBO复制到默认帧缓冲区*/
    glBlitFramebuffer(0,0,宽度,高度,
    0,0,宽度,高度,
    GL_颜色_缓冲_位| GL_深度_缓冲_位,
    GL_(最近);
    
    这里有几件事值得一提: 首先,从一个帧缓冲区到另一个帧缓冲区的间歇通常比绘制两个填充整个视口的纹理三角形要慢得多,在blit深度或模具图像时不能使用线性过滤。。。但是,如果采用纹理映射方法,则可以实现这一点(这只在源缓冲区和目标缓冲区的分辨率不同时才真正重要)


    总体而言,绘制纹理基本体是更灵活的解决方案。如果您需要执行多采样消除混叠,则Blitting是最有用的,因为您必须在着色器中实现,否则,多采样纹理将在帧缓冲区对象之后添加;一些较旧的硬件/驱动程序支持fbo,但不支持多采样颜色(需要DX10硬件)或深度(需要DX10.1硬件)纹理。

    非常感谢您的精彩解释,朋友:-)可以从渲染缓冲对象blit到fbo吗?