连续转换为 GLSL 中的纹理

Succesive transformations to a texture in GLSL

我正在尝试使用 GLSL 中的着色器进行图像处理以获得良好的性能和可移植性。

但是我有多个步骤来转换图像,每个步骤都需要上一步的信息。

例如,我想模糊图像,所以我需要每个像素周围的像素信息来平均它们,这不是问题,我只使用 texture2D(u_texture, v_texCoords); 并且在处理之后我有一个vec4 blurred

然后,在模糊之后,我想对之前模糊的图像进行边缘检测,但是我无法使用 vec4 blurred 来完成,因为它无法让我访问周围的像素。如果我再次使用 texture2D(u_texture, v_texCoords);,我会在第一张图片上进行处理,而不是在模糊图像上进行处理。

在其他世界,在图像处理的每一步之后,我都想访问上一步的所有像素。

(我在 GLSL 中使用 java 和 libgdx 和着色器)

谢谢。

类似这样的标准方法是 'ping-pong' 在两个渲染到纹理 (RTT) 缓冲区之间。例如,在模糊之后进行边缘检测的情况下,您可以执行以下渲染过程:

  1. 使用执行水平高斯模糊的着色器将初始纹理渲染到 RTT #1。
  2. 使用进行垂直高斯模糊的着色器将 RTT #1 渲染到 RTT #2。
  3. 使用进行边缘检测的着色器将 RTT #2 渲染到 RTT #1。

相同的原理可以扩展到将任意数量的 post 处理效果链接在一起,在两个缓冲区之间连续跳动。

请注意,在我的插图中,我将模糊分成两个通道,利用模糊是可分离效果这一事实。通过分离水平通道和垂直通道来处理大型模糊内核通常效率更高,并且最终得到相同的结果。