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