我想使用 OpenGL ES 2.0 中的片段着色器创建模糊效果。我感兴趣的算法只是一个平均模糊 - 将所有相邻像素添加到我自己中并除以 9 进行标准化。
但是我有两个问题:
1)这是否需要我首先渲染到帧缓冲区,然后切换渲染目标?或者有更简单的方法
2) 假设我将“源”图像绑定为模糊纹理 0,并且输出模糊纹理。如何访问不是我当前正在处理的像素。垂直着色器已为像素 i 调用我,但我需要访问我周围的像素。如何?我怎么知道我是否是边缘情况(字面意思是在屏幕边缘)
(3:是否有更合适的算法来得到模糊的磨砂玻璃看起来模糊)
进一步阐述马蒂亚斯所说的话:
是的。您将图像渲染为纹理(最好使用 FBO 完成),然后在第二个(模糊)通道中绑定该纹理并从中读取。您无法一步执行渲染和模糊通道,因为您无法访问当前正在渲染的帧缓冲区。这会引入数据依赖性,因为您的邻居还不需要获得最终颜色,或者更糟糕的是颜色取决于您。
您可以在特殊片段着色器变量中获取当前像素的坐标gl_FragCoord
并将它们用作包含先前渲染图像的纹理的纹理坐标,同样gl_FragCoord.x +/- 1
and gl_FragCoord.y +/- 1
为了邻居。但正如 Matias 所说,您需要分别将这些值除以(图像的)宽度和高度,因为纹理坐标位于 [0,1] 中。通过使用GL_CLAMP_TO_EDGE
作为纹理的环绕模式,边缘情况由纹理硬件自动处理。因此,在边缘处,您仍然会得到 9 个值,但只有 6 个不同的值(另外 3 个值,实际上位于图像之外,只是其内部邻居的重复项)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)