如何在 OpenGL ES 2.0 中使用可分离滤镜着色器?
How to use separable filter shaders in OpenGL ES 2.0?
我正在尝试在我的 iOS 应用程序中使用着色器进行图像处理。我可以使用一对着色器(顶点和片段)来过滤图像(例如垂直或水平模糊),但是如果我需要先应用垂直模糊然后应用水平模糊怎么办。我应该如何 link 在我的 render()
功能中执行此操作?
最好有一些代码示例!
你真的无能为力。在开始下一步之前,您需要从模糊的一个步骤填充缓冲区。您可以做的最好的事情是在第一次传递时绘制到纹理,然后在第二次传递到主缓冲区时重新绘制。一般来说,如果你有超过 2 个通道,你将需要 2 个纹理,然后在每次通道后交换:使用第一个着色器绘制图像到纹理 1,第二个从纹理 1 到纹理 2,第三个从纹理 2 到纹理 1 ...
所以你需要的是一个帧缓冲区对象(FBO),这意味着简单地生成一个新的帧缓冲区和一个具有所需大小的纹理(你很可能需要使用 POT 纹理),将纹理附加到帧缓冲区作为颜色附件 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0);
.
完成此操作后,您将获得相当标准的绘图程序。简单地绑定这个帧缓冲区来绘制它,设置视口,设置矩阵(如果有的话)...所有这些都将被绘制到纹理上,就好像它是主缓冲区一样。
完成对纹理的绘制后,您可以使用该纹理将其绘制回主缓冲区。只需绑定主缓冲区并绑定来自 FBO 的纹理而不是来自原始图像的纹理。其余代码应该相同。
我正在尝试在我的 iOS 应用程序中使用着色器进行图像处理。我可以使用一对着色器(顶点和片段)来过滤图像(例如垂直或水平模糊),但是如果我需要先应用垂直模糊然后应用水平模糊怎么办。我应该如何 link 在我的 render()
功能中执行此操作?
最好有一些代码示例!
你真的无能为力。在开始下一步之前,您需要从模糊的一个步骤填充缓冲区。您可以做的最好的事情是在第一次传递时绘制到纹理,然后在第二次传递到主缓冲区时重新绘制。一般来说,如果你有超过 2 个通道,你将需要 2 个纹理,然后在每次通道后交换:使用第一个着色器绘制图像到纹理 1,第二个从纹理 1 到纹理 2,第三个从纹理 2 到纹理 1 ...
所以你需要的是一个帧缓冲区对象(FBO),这意味着简单地生成一个新的帧缓冲区和一个具有所需大小的纹理(你很可能需要使用 POT 纹理),将纹理附加到帧缓冲区作为颜色附件 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0);
.
完成此操作后,您将获得相当标准的绘图程序。简单地绑定这个帧缓冲区来绘制它,设置视口,设置矩阵(如果有的话)...所有这些都将被绘制到纹理上,就好像它是主缓冲区一样。
完成对纹理的绘制后,您可以使用该纹理将其绘制回主缓冲区。只需绑定主缓冲区并绑定来自 FBO 的纹理而不是来自原始图像的纹理。其余代码应该相同。