【问题标题】:OpenGL - Draw two textures using the same FBO?OpenGL - 使用相同的 FBO 绘制两个纹理?
【发布时间】:2015-07-19 06:43:54
【问题描述】:

如何使用同一个 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);
}

谢谢!

【问题讨论】:

  • 只需绘制带纹理的四边形……更容易,更省事。是的,我知道您必须为此设置一个着色器。那又怎样……?

标签: opengl textures fbo


【解决方案1】:

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

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。但是单独切换读取缓冲区可能是最便宜的。

【讨论】:

  • 谢谢@derhass :) 例如,如何使用glReadBuffer() 选择GL_COLOR_ATTACHMENT1?像这样:glReadBuffer(GL_COLOR_ATTACHMENT1)?我见过一些使用GL_NONEGL_BACK 的例子,但不清楚如何在颜色附件之间切换
  • 绑定 FBO 时,glReadBuffer 的有效值为 GL_COLOR_ATTACHMENTi 枚举,所以这很简单。
  • 我仍然只得到一个纹理:/。我是这样使用的: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); }我按照你说的绑定...但它仍然无法正常工作:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多