2015-01-12 49 views
4

如何使用OpenGL着色器修改现有的纹理/帧缓冲区而不使用第二个纹理或帧缓冲区?这甚至有可能吗?运行OpenGL着色器修改现有的纹理/帧缓冲区

+1

不,你需要一个单独的缓冲区来保持旧的,而你正在写新的,你只是无法绕过。 –

+0

因此,使用与采样器和帧缓冲区相同的纹理是不可能的? – jjxtra

+0

想一想,如果片段着色器对先前调用已写入的像素进行采样,OpenGL可以防止程序员犯这个错误 –

回答

5

起初: 这在技术上是可行且安全的读取和使用this extension在同一通写 - 但是我不建议这一点,尤其是对学生,因为扩展紧紧有限,可能不支持在每个硬件上。

话虽这么说:

所以它不可能使用相同的纹理作为采样和帧缓冲?

您可以使用纹理作为一个帧缓冲材质附着相同,渲染它,作为一个纹理采样器查找值在着色器,但不在同一通。这意味着,如果您有两个纹理,您可以从A读取并写入B,然后切换纹理并从B中读取并写入A.但是从来没有A-> A或B-> B(没有提及的扩展名)。

作为一个技术细节,当前被用作目标的纹理也可以同时绑定到采样器着色器变量,但是您不能使用它。

所以我们假设我想模糊纹理的一小部分。我必须通过着色器运行到第二个纹理,然后将该纹理复制回第一个纹理/帧缓冲区?

第二个纹理是。但出于效率原因,请勿复制纹理数据。只需删除源纹理并使用将来渲染的目标纹理即可。如果必须经常这样做,请将源纹理保留为渲染目标,以备将来使用,以提高性能。如果你不得不这样做,那么每一帧都只是在每一帧交换纹理。开销很小。

+0

或者如果你有多个通行证你需要做,那么只是在同一帧中来回渲染。 –

相关问题