我试图在我的iOS应用中使用着色器进行图像处理。我可以使用一对着色器(顶点和片段)作为滤镜图像(例如垂直或水平模糊),但是如果我需要首先应用垂直模糊然后应用水平模糊呢。我应该如何在render()
函数中链接此操作?
一些代码示例非常棒!
答案 0 :(得分:2)
你无能为力。在开始下一步之前,您需要从模糊的一个步骤填充缓冲区。您可以做的最好的事情是首先通过绘制纹理,然后重新绘制第二遍到主缓冲区。一般来说,如果你有超过2次传球,你将需要2个纹理,然后在每次传递后交换:用第一个着色器绘制图像到texture1,第二个从texture1到texture2,第三个从texture2到texture1 ......
所以你需要的是一个帧缓冲对象(FBO),这意味着只需生成一个新的帧缓冲区和一个具有所需大小的纹理(你很可能需要使用POT纹理),将纹理附加到帧缓冲区作为颜色附件glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0);
。
完成此操作后,您将获得相当多的标准绘图程序。只需绑定此帧缓冲区以绘制到它,设置视口,设置矩阵(如果有的话)...所有将被绘制到纹理,就像它是主缓冲区一样。
完成绘制到纹理后,您可以使用该纹理将其绘制回主缓冲区。只需绑定主缓冲区并绑定FBO中的纹理,而不是原始图像中的纹理。其余的代码应该是相同的。