【问题标题】:Creating blur filter with a shader - access adjacent pixels from fragment shader?使用着色器创建模糊滤镜 - 从片段着色器访问相邻像素?
【发布时间】:2011-07-27 18:53:35
【问题描述】:

我想在 OpenGL ES 2.0 中使用片段着色器创建模糊效果。我感兴趣的算法只是一个平均模糊 - 将所有相邻像素添加到我自己并除以 9 以进行归一化。

但是我有两个问题:

1) 这是否需要我先渲染到帧缓冲区,然后切换渲染目标?或者有没有更简单的方法

2) 假设我将我的“源”图像绑定为纹理 0,并且我正在输出我的模糊纹理。如何访问不是我当前处理的像素。 vert shader 为像素 i 调用了我,但我需要访问我周围的像素。如何?我怎么知道我是否是边缘案例(字面意思是在屏幕边缘)

(3:有没有更合适的算法来获得模糊的毛玻璃看起来模糊)

【问题讨论】:

    标签: opengl-es-2.0 shader


    【解决方案1】:

    详细说明 Matias 所说的内容:

    1. 是的。您将图像渲染为纹理(最好使用 FBO 完成),然后在第二个(模糊)传递中绑定此纹理并从中读取。您无法一步执行渲染和模糊传递,因为您无法访问当前正在渲染的帧缓冲区。这会引入数据依赖性,因为您的邻居还不需要拥有最终颜色,或者更糟糕的是颜色取决于您。

    2. 1234563但就像 Matias 所说,您需要分别按(图像的)宽度和高度来划分这些值,因为纹理坐标在 [0,1] 中。通过使用GL_CLAMP_TO_EDGE 作为纹理的包装模式,边缘情况由纹理硬件自动处理。所以在边缘你仍然得到 9 个值,但只有 6 个不同的值(另外 3 个,实际上在图像之外,只是它们内部邻居的副本)。

    【讨论】:

      【解决方案2】:

      1) 是的,使用 FBO 是可行的方法。

      2) 用数学计算,如果你在像素 (x, y),那么邻居是 (x+1, y), (x, y+1), (x+1, y+1), ( x-1, y) 等。边缘情况使用纹理的环绕模式处理。请注意,由于 GL_TEXTURE_2D 使用归一化坐标,因此偏移量不是 1,而是纹理的 1 / 宽度和 1 / 高度。

      【讨论】:

      • 您能否更具体地了解我如何从片段着色器中访问这些邻居?
      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2021-09-17
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多