【问题标题】:Succesive transformations to a texture in GLSL在 GLSL 中对纹理的连续转换
【发布时间】:2015-10-08 13:50:28
【问题描述】:

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

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: image opengl glsl shader


    【解决方案1】:

    这样的标准方法是在两个渲染到纹理 (RTT) 缓冲区之间进行“乒乓”。例如,在模糊之后进行边缘检测的情况下,您可能会执行以下渲染通道:

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

    同样的原理可以扩展到将任意数量的后处理效果链接在一起,在两个缓冲区之间不断地反弹。

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

    【讨论】:

    • 好的,谢谢你的乒乓球课:)!这似乎是做我想做的事的好方法。我会在完成后发布我的代码(如果它有效)。
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多