0

我正在尝试渲染到 fbo,然后将该纹理用作我的第二个渲染通道的输入以进行后期处理,但似乎会glClear影响glClearColor已渲染到的纹理。我怎样才能让它们只影响显示缓冲区?

我的代码看起来像这样:

UseRenderingShaderProgram();
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

renderWorld();

// render to screen
UsePostProcessingShaderProgram();
glBindFramebuffer(GL_FRAMEBUFFER, 0);

glClearColor(0.0, 0.0, 0.0, 1.0); // <== texture appears to get cleared in this two lines.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

renderWorld();

glfwSwapBuffers();
4

1 回答 1

1

如果我必须做出有根据的猜测,您已将纹理定义为使用 mipmap 缩小过滤。使用 FBO 渲染到纹理后,只定义了一个 mipmap 级别。但是,如果没有创建所有选定的 mipmap 级别,则纹理是不完整的,并且不会传递数据。最简单的解决方案是通过设置其缩小过滤器参数来禁用此纹理的 mipmapping

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

此外,您必须确保正确解绑和绑定附加到 FBO 的纹理。

  • 在绑定 FBO 之前取消绑定纹理(您可以一直安全地将其连接到它)。

  • 在将纹理绑定为图像源进行渲染之前取消绑定 FBO。

添加这两个更改(绑定顺序和 mipmap 级别)应该会使您的纹理出现。

于 2013-04-23T09:50:59.550 回答