将opengl主帧缓冲区复制到fbo

Posted

技术标签:

【中文标题】将opengl主帧缓冲区复制到fbo【英文标题】:copy opengl main framebuffer to a fbo 【发布时间】:2013-03-31 05:25:50 【问题描述】:

我想将 opengl 主帧缓冲区复制到一个 fbo,它附加两个纹理对象。然后我想将颜色缓冲区和深度缓冲区传输到两个纹理对象。我使用glbiltframebuffer,但纹理是黑色的,正确的方法是什么?我的代码:

// Create the FBO
glGenFramebuffers(1, &m_fbo);    
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);  

// Create textures
glGenTextures(1, &m_colorTexture);
glGenTextures(1, &m_depthTexture);

// color texture
glBindTexture(GL_TEXTURE_2D, m_colorTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_FLOAT, NULL);
glFramebufferTexture2(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTexture, 0); 

// depth texture
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);

GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (Status != GL_FRAMEBUFFER_COMPLETE) 
    printf("error, status: 0x%x\n", Status);
    return false;


// restore default FBO
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);


    //copy the main framebuffer to FBO
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);  
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);  
glBlitFramebuffer(0, 0, Width, Height, 0, 0, Width, Height,  GL_COLOR_BUFFER_BIT, GL_NEAREST); 
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);       
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
GLenum error = glGetError();

`

【问题讨论】:

怎么知道复制的数据是黑色的?另外,为什么要将扩展与核心功能混为一谈?如果您使用的是核心 FBO,那么您不应该在任何东西上使用 EXT 后缀。 我画了一个物体并绑定了FBO的纹理。不使用EXT扩展时,也得到黑色数据。 【参考方案1】:

我解决了,代码是对的。其他地方发生错误,对不起。 但我一直被比尔特的速度所困扰。我将主帧缓冲区复制到每帧的 fbo。但是好像帧率下降了很多。大家能不能给点建议。

【讨论】:

以上是关于将opengl主帧缓冲区复制到fbo的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:复制帧缓冲区对象

OpenGL 帧缓冲区 + LibGDX

OpenGL(FBO)中的普通后台缓冲区+渲染到深度纹理

渲染到窗口帧缓冲区和 FBO 以保存全尺寸纹理图像

iOS OpenGL ES Analyzer 列出“不存在的帧缓冲区附件”和“缺少帧缓冲区附件”,但 FBO 工作

关于 OpenGL 纹理、帧缓冲区和 UV 坐标的问题 [关闭]