如何使用相同的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);
}
谢谢!
答案 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_ATTACHMENT0
和GL_COLOR_ATTACHMENT1
,并且可以使用
glReadBuffer()
选择哪个glBlitFramebuffer()
将从中读取。不要将当前选择的读取和绘制缓冲区与当前绑定读取和rsw帧缓冲区混淆。这些是不同的概念。绘图将始终进入当前绑定的GL_DRAW_FRAMEBUFFER
的当前选定的绘制缓冲区,并且对颜色缓冲区的读取操作源来自当前绑定的GL_READ_FRAMEBUFFER
的当前所选读取帧缓冲区的像素数据。
另一种选择是一次只附加一个纹理,然后在它们之间切换。甚至使用两个FBO。但是单独切换读缓冲区可能是最便宜的。