【问题标题】:OpenGL Framebuffer - rendering to texture creates texture with main framebufer contentOpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理
【发布时间】: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) 的内容。

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

【问题讨论】:

    标签: c++ opengl framebuffer


    【解决方案1】:

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

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

    【讨论】:

    • 这完全是我的错误。是的,你是对的。我认为 glReadPixels 将从绑定纹理而不是 fbo 读取。接受这个作为答案。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 2023-03-06
    • 2011-09-06
    • 2011-11-24
    • 2016-09-27
    • 2014-07-08
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多