如何在OpenGL ES 2.0中使用可分离的滤镜着色器?

时间:2015-11-27 09:30:52

标签: ios opengl-es opengl-es-2.0

我试图在我的iOS应用中使用着色器进行图像处理。我可以使用一对着色器(顶点和片段)作为滤镜图像(例如垂直或水平模糊),但是如果我需要首先应用垂直模糊然后应用水平模糊呢。我应该如何在render()函数中链接此操作?

一些代码示例非常棒!

1 个答案:

答案 0 :(得分:2)

你无能为力。在开始下一步之前,您需要从模糊的一个步骤填充缓冲区。您可以做的最好的事情是首先通过绘制纹理,然后重新绘制第二遍到主缓冲区。一般来说,如果你有超过2次传球,你将需要2个纹理,然后在每次传递后交换:用第一个着色器绘制图像到texture1,第二个从texture1到texture2,第三个从texture2到texture1 ......

所以你需要的是一个帧缓冲对象(FBO),这意味着只需生成一个新的帧缓冲区和一个具有所需大小的纹理(你很可能需要使用POT纹理),将纹理附加到帧缓冲区作为颜色附件glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0);

完成此操作后,您将获得相当多的标准绘图程序。只需绑定此帧缓冲区以绘制到它,设置视口,设置矩阵(如果有的话)...所有将被绘制到纹理,就像它是主缓冲区一样。

完成绘制到纹理后,您可以使用该纹理将其绘制回主缓冲区。只需绑定主缓冲区并绑定FBO中的纹理,而不是原始图像中的纹理。其余的代码应该是相同的。