OpenGL - 使用相同的 FBO 绘制两个纹理?

OpenGL - Draw two textures using the same FBO?

如何使用同一个 FBO 绘制两个纹理?

如下所示,我有一个 initDesktop() 初始化我的两个纹理(之前使用 SOIL 加载)。 在我的另一个 class 上,我想执行 drawDesktop() 来绘制我的背景矩形和一个纹理矩形...

我只看到页脚... 我在这里缺少什么?

已编辑

void Desktop::initDesktop ()
{
    GLuint fboId = 0;
    glGenFramebuffers(1, &fboId);
    glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);

    //now with GL_COLOR_ATTACHMENT0
    glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, m_background.getId(), 0);

    //now with GL_COLOR_ATTACHMENT1
    glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,GL_TEXTURE_2D, m_footer.getId(), 0);
}

void Desktop::drawDesktop ()
{
    drawBackground ();
    drawFooter ();
}

void Desktop::drawBackground ()
{
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glReadBuffer(GL_COLOR_ATTACHMENT0); //<-- ?
    glBlitFramebuffer(0, 0, 1200, 800, 0, 0, 1200, 800, GL_COLOR_BUFFER_BIT, GL_NEAREST);

}

void Desktop::drawFooter ()
{
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glReadBuffer(GL_COLOR_ATTACHMENT1); //<-- ?
    glBlitFramebuffer(0, 0, 1200, 100, 0, 0, 1200, 100, GL_COLOR_BUFFER_BIT, GL_NEAREST);
}

谢谢!

您正在尝试将两个纹理附加到同一个附加点:

glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, m_background.getId(), 0);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, m_footer.getId(), 0);

后一个调用将覆盖前一个。所以你有绑定到这个 FBO 的页脚纹理。要解决此问题,您可以将两个纹理附加到不同的附加点,例如 GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT1 并且可以使用 glReadBuffer() 到 select glBlitFramebuffer() 将从哪一个读取。不要将当前 selected 读取和绘制缓冲区与当前绑定的读取和 rsw 帧缓冲区混淆。这些是不同的概念。绘图将始终进入当前绑定 GL_DRAW_FRAMEBUFFER 的当前 selected drawbuffer(s),并在颜色缓冲区源上读取操作从当前 selected 读取帧缓冲区的像素数据当前绑定 GL_READ_FRAMEBUFFER

另一种选择是一次只附加一个纹理,然后在它们之间切换。甚至使用两个 FBO。但是单独切换读取缓冲区可能是最便宜的。