在GLSL中对纹理的成功转换

时间:2015-10-07 20:22:34

标签: image opengl glsl shader

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

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

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

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

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

(我正在使用带有libgdx的java和GLSL中的着色器)

谢谢。

1 个答案:

答案 0 :(得分:3)

这种类似的标准方法是在两个渲染到纹理(RTT)缓冲区之间“乒乓”。例如,在模糊后跟边缘检测的情况下,您可以执行以下渲染过程:

  1. 使用着色器执行水平高斯模糊,将初始纹理渲染到RTT#1中。
  2. 使用着色器执行垂直高斯模糊,将RTT#1渲染到RTT#2中。
  3. 使用着色器进行边缘检测,将RTT#2渲染到RTT#1中。
  4. 同样的原则可以扩展到将任意数量的后处理效果链接在一起,在两个缓冲区之间不断反弹。

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