【发布时间】:2015-05-30 22:18:49
【问题描述】:
在 OpenGL ES 中,我正在绘制帧缓冲区纹理对象。有没有办法使用上一次绘制的纹理自己的数据在同一个纹理上进行多次绘制?您必须在第一次绘制后清除纹理,但似乎数据将被删除,这是第二次绘制所需的。我必须创建两个单独的纹理吗?并将第二个纹理绑定到帧缓冲区?我讨厌不得不使用那个 VRAM。
【问题讨论】:
标签: opengl-es framebuffer
在 OpenGL ES 中,我正在绘制帧缓冲区纹理对象。有没有办法使用上一次绘制的纹理自己的数据在同一个纹理上进行多次绘制?您必须在第一次绘制后清除纹理,但似乎数据将被删除,这是第二次绘制所需的。我必须创建两个单独的纹理吗?并将第二个纹理绑定到帧缓冲区?我讨厌不得不使用那个 VRAM。
【问题讨论】:
标签: opengl-es framebuffer
不,在大多数情况下,您不能同时使用相同的纹理作为渲染目标和纹理。这就是规范所说的“渲染反馈循环”,它会产生未定义的结果。来自 ES 2.0 规范的第 4.4.4 节:
当纹理对象同时用作 GL 操作的源和目标时,可能存在反馈循环。当存在反馈循环时,会产生未定义的行为。
在定义结果时存在一些例外情况,尤其是在渲染目标和纹理未使用相同的 mipmap 级别时。但这是一个有点深奥的案例(例如,如果您想实现自己的 mipmap 生成,可以使用它)。它不能帮助你做你想做的事。
因此,对于您想要的那种多通道渲染,您需要两个纹理,其中一个用作源,另一个用作目标。请注意,即使您需要两个以上的通道,您通常仍然只需要两个纹理。您可以在每次传递中在两者之间“乒乓”,使传递n 的目标成为传递n + 1 的源,传递n 的源成为传递n + 1 的目标。
【讨论】: