在 OpenGL ES 中使用帧缓冲区纹理进行多通道渲染

Multipass rendering with framebuffer texture in OpenGL ES

在 OpenGL ES 中,我绘制到帧缓冲区纹理对象。有没有办法在同一个纹理上使用纹理自己的上一次绘制数据进行多次绘制?您必须在第一次绘制后清除纹理,但随后似乎数据将被删除,这是第二次绘制所需的。我必须创建两个单独的纹理吗?并将第二个纹理绑定到帧缓冲区?我讨厌不得不使用那个显存。

不,在大多数情况下,您不能将相同的纹理同时用作渲染目标和纹理。这就是规范所称的 "rendering feedback loop",它会产生未定义的结果。来自 ES 2.0 规范的第 4.4.4 节:

A feedback loop may exist when a texture object is used as both the source and destination of a GL operation. When a feedback loop exists, undefined behavior results.

在定义结果时存在一些例外情况,特别是如果相同的 mipmap 级别未同时用于渲染目标和纹理。但这是一个有点深奥的案例(例如,如果您想实现自己的 mipmap 生成,则可以使用它)。它不会帮助你做你想做的事。

因此,对于您想要的那种多通道渲染,您需要两个纹理,其中一个用作源,另一个用作目标。请注意,即使您需要两次以上的传递,您通常仍然只需要两个纹理。您可以在每个通道中在两者之间 "ping pong",这样通道 n 中的目标成为通道 n + 1 中的源,通道 n 中的源成为通道中的目标通过 n + 1.