OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理

Posted

技术标签:

【中文标题】OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理【英文标题】:OpenGL Framebuffer - rendering to texture creates texture with main framebufer content 【发布时间】:2016-08-02 19:40:52 【问题描述】:

这基本上是更大项目的一部分,我正在通过以下方式创建具有颜色、深度和模板缓冲区的帧缓冲区:

// Create texture
glGenTextures(1, &m_textureInput);
glBindTexture(GL_TEXTURE_2D, m_textureInput);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWidth(), getHeight(), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
// Create FBOs
glGenFramebuffers(1, &m_fboInput);

glBindFramebuffer(GL_FRAMEBUFFER, m_fboInput);

// Attach texture to it
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureInput, 0);

// Render buffer, depth with stencil
glGenRenderbuffers(1, &m_rbDepthStencilInput);
glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthStencilInput);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, getWidth(), getHeight());
//Attach depth buffer to FBO
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthStencilInput);
//Also attach as a stencil
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthStencilInput);

status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)

    // Restore current framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    return false;


glBindFramebuffer(GL_FRAMEBUFFER, 0);

我绑定它以渲染它:

glBindFramebuffer(GL_FRAMEBUFFER, m_fboInput);
// render
glBindFramebuffer(GL_FRAMEBUFFER, 0);

当我转储附加纹理时:

glBindTexture(GL_TEXTURE_2D, m_textureInput);
long imageSize = x * y * 4;
unsigned char *data = new unsigned char[imageSize];
glReadPixels(0,0,x,y, GL_BGRA,GL_UNSIGNED_BYTE,data);

我收到主帧缓冲区 (0) 的内容。

知道我做错了什么吗? 提前致谢。

【问题讨论】:

【参考方案1】:

glReadPixels docs 说它从帧缓冲区读取数据。由于您之前将零绑定到它,我猜它是从默认帧缓冲区读取的。

您可以绑定帧缓冲区对象,然后使用GL_COLOR_ATTACHMENT0 调用glReadBuffer,然后执行glReadPixels,或者更直接地,使用glGetTexImage 直接从您的纹理中读取。

【讨论】:

这完全是我的错误。是的,你是对的。我认为 glReadPixels 将从绑定纹理而不是 fbo 读取。接受这个作为答案。

以上是关于OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理的主要内容,如果未能解决你的问题,请参考以下文章

创建没有帧缓冲区绑定的 Opengl 渲染缓冲区

OpenGL 渲染到纹理 - 黑屏

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

Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样

OpenGL ES 学习教程(十四) 帧缓冲区对象(FBO) 实现渲染到纹理(Render To Texture/RTT)

◮OpenGL-帧缓冲