【问题标题】:Regarding render to texture关于渲染到纹理
【发布时间】:2013-01-31 02:48:41
【问题描述】:

我正在实现渲染到纹理的概念,但对 FBO 的范围存有疑问。 在我完成对默认 FBO 的 glDrawArrays 调用并渲染到纹理后,我将删除纹理和非默认 FBO。然后我调用 glReadPixels 来读取默认 FBO 上的内容。 所以,我的问题是我做得对吗?我的意思是我应该在删除 FBO 和纹理之前调用 readpixel 吗?

我假设在默认 FBO 上绘制后,我们不需要非默认 FBO 和纹理,但后来一些 OpenGL 开发人员告诉我,我在上面提到的应用程序中做了一些奇怪的事情。请帮助我理解这一点。

以下是我正在遵循的步骤:

  1. 创建一个帧缓冲对象并附加一个合适的纹理作为颜色附件
  2. 绑定并清除FBO
  3. 渲染一些图元
  4. 取消绑定 FBO 从而切换回系统 FBO
  5. 绑定用作颜色附件的纹理
  6. 使用上面创建的纹理在系统 FBO 上渲染。
  7. 删除纹理和创建的 FBO。
  8. 来自系统 FBO 的 glReadpixel。

现在,正如我在系统 FBO 上渲染的那样。为什么我们还需要那个纹理和其他用作纹理的 FBO?

注意:我使用术语系统 FBO 来区分两个 FBO,这是我的术语。

【问题讨论】:

  • 您的意思是删除 FBO 输入或附加的 FBO 输出纹理?渲染到输出纹理后,您就完成了 FBO。如果你删除它不会有任何影响。只要您保留目标(附加输出)纹理并且当然不要删除它。
  • 我认为奇怪的是,您为每次绘图迭代重新创建和删除中间 FBO 和纹理。这是缓慢而低效的。通常你只创建一次然后回收它们。只有在需要更改尺寸时才删除并重新创建它们。
  • @datenwolf:我没有循环,只有 1 帧。
  • @Robinson:我的意思是由 glGenBuffer 调用和纹理创建的 FBO,它是颜色附件。

标签: opengl render-to-texture


【解决方案1】:

我建议阅读:http://www.songho.ca/opengl/gl_fbo.html

但总而言之,这里有一点 OpenGL 中渲染到纹理的伪代码

init() {
    // setup FBO, attachments, etc...
}

render() {
    glBindFramebuffer(your_fbo);
    glClearBuffer(...);
    renderScene();

    glBindFramebuffer(0);  // setup default, system FBO
    glBindTexture(texture_id_that_was_attached_to_FBO);
    renderSecondScene();
}

渲染场景后无需删除纹理或 fbo,请在应用程序结束时在某些清理过程中删除它们。

【讨论】:

  • 我猜你问错了。我想知道当我在 readpixel 调用之前和 glDrawArray 之后删除纹理/fbo 时出了什么问题。
  • 好的,但是不需要删除纹理和调用readpixels,也许可以发布一些代码......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2011-11-24
相关资源
最近更新 更多