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

标签 ios opengl-es opengl-es-2.0

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

一些代码示例会很棒!

最佳答案

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

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

完成此操作后,您将获得相当标准的绘图程序。简单地绑定(bind)这个帧缓冲区来绘制它,设置视口(viewport),设置矩阵(如果有的话)...所有这些都将被绘制到纹理上,就好像它是主缓冲区一样。

一旦你完成了对纹理的绘制,你就可以使用该纹理将它绘制回你的主缓冲区。只需绑定(bind)主缓冲区并绑定(bind)来自 FBO 的纹理而不是来自原始图像的纹理。其余代码应该相同。

关于ios - 如何在 OpenGL ES 2.0 中使用可分离滤镜着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33954236/

相关文章:

iphone - 如何将纹理映射到二十面体的边上?

用于简单水面效果的 GLSL

ios - 将统一颜色传递给片段着色器 (openGL ES 2.0)

iphone - iOS - 缩放和裁剪 CMSampleBufferRef/CVImageBufferRef

javascript - 防止键盘关闭时出现模糊事件

iOS 7通用后台UIViewController

opengl-es - 着色器管理

iphone - 当 OpenGL ES (iPhone) 上下文被释放时,纹理缓冲区是否会刷新?

iphone - 如何为 opengles 2.0 实现 glOrtho?有或没有 glOrtho 规范中的 tx、ty、tz 值?

iOS 应用构建未显示在 iTunes Connect 中