我正在尝试使用GLSL中的着色器进行图像处理,以获得良好的性能和便携性。
但我有多个步骤来转换图像,每个步骤都需要上一步的信息。
例如,我想模糊图像,所以我需要每个像素周围的像素的信息来平均它们,这不是问题,我只是使用texture2D(u_texture, v_texCoords);
并且在处理之后我有{{ 1}}
然后,在模糊之后,我想对先前模糊的图像进行边缘检测,但我无法使用vec4 blurred
进行边缘检测,因为它不能让我访问周围的像素。如果我再次使用vec4 blurred
,我会在第一张图片上进行处理而不是在模糊图像上进行处理。
在其他世界中,在图像处理的每个步骤之后,我想要访问上一步的所有像素。
(我正在使用带有libgdx的java和GLSL中的着色器)
谢谢。
答案 0 :(得分:3)
这种类似的标准方法是在两个渲染到纹理(RTT)缓冲区之间“乒乓”。例如,在模糊后跟边缘检测的情况下,您可以执行以下渲染过程:
同样的原则可以扩展到将任意数量的后处理效果链接在一起,在两个缓冲区之间不断反弹。
请注意,在我的插图中,我将模糊分为两遍,利用模糊效果可分离的事实。通过分离水平和垂直通道来处理大型模糊内核通常效率更高,最终会得到相同的结果。