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

时间:2015-03-26 18:34:00

标签: opengl-es framebuffer

在OpenGL ES中,我正在绘制一个framebuffer-texture对象。有没有办法在相同的纹理上使用纹理自己的数据绘制相同的纹理?你必须在第一次绘制后清除纹理,但是似乎数据将被删除,这是第二次所需的。我是否必须创建两个单独的纹理?并将第二个纹理绑定到帧缓冲区?我讨厌必须使用那个VRAM。

1 个答案:

答案 0 :(得分:0)

不,在大多数情况下,您不能使用与渲染目标相同的纹理和同时进行纹理处理。这就是规范所谓的#34;渲染反馈循环",它会产生未定义的结果。来自ES 2.0规范的4.4.4节:

  

当纹理对象用作GL操作的源和目标时,可能存在反馈循环。当存在反馈循环时,会产生未定义的行为。

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

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