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

时间:2015-07-18 19:23:50

标签: opengl textures fbo

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

如下所示,我有initDesktop()我初始化我的两个纹理(之前使用SOIL加载)。 在我的另一课上,我想执行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);
}

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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()选择哪个glBlitFramebuffer()将从中读取。不要将当前选择的读取和绘制缓冲区与当前绑定读取和rsw帧缓冲区混淆。这些是不同的概念。绘图将始终进入当前绑定的GL_DRAW_FRAMEBUFFER的当前选定的绘制缓冲区,并且对颜色缓冲区的读取操作源来自当前绑定的GL_READ_FRAMEBUFFER的当前所选读取帧缓冲区的像素数据。

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