【发布时间】:2013-01-31 02:48:41
【问题描述】:
我正在实现渲染到纹理的概念,但对 FBO 的范围存有疑问。 在我完成对默认 FBO 的 glDrawArrays 调用并渲染到纹理后,我将删除纹理和非默认 FBO。然后我调用 glReadPixels 来读取默认 FBO 上的内容。 所以,我的问题是我做得对吗?我的意思是我应该在删除 FBO 和纹理之前调用 readpixel 吗?
我假设在默认 FBO 上绘制后,我们不需要非默认 FBO 和纹理,但后来一些 OpenGL 开发人员告诉我,我在上面提到的应用程序中做了一些奇怪的事情。请帮助我理解这一点。
以下是我正在遵循的步骤:
- 创建一个帧缓冲对象并附加一个合适的纹理作为颜色附件
- 绑定并清除FBO
- 渲染一些图元
- 取消绑定 FBO 从而切换回系统 FBO
- 绑定用作颜色附件的纹理
- 使用上面创建的纹理在系统 FBO 上渲染。
- 删除纹理和创建的 FBO。
- 来自系统 FBO 的 glReadpixel。
现在,正如我在系统 FBO 上渲染的那样。为什么我们还需要那个纹理和其他用作纹理的 FBO?
注意:我使用术语系统 FBO 来区分两个 FBO,这是我的术语。
【问题讨论】:
-
您的意思是删除 FBO 输入或附加的 FBO 输出纹理?渲染到输出纹理后,您就完成了 FBO。如果你删除它不会有任何影响。只要您保留目标(附加输出)纹理并且当然不要删除它。
-
我认为奇怪的是,您为每次绘图迭代重新创建和删除中间 FBO 和纹理。这是缓慢而低效的。通常你只创建一次然后回收它们。只有在需要更改尺寸时才删除并重新创建它们。
-
@datenwolf:我没有循环,只有 1 帧。
-
@Robinson:我的意思是由 glGenBuffer 调用和纹理创建的 FBO,它是颜色附件。