TwoPassFilter GPUImage实际上是做什么的?

7
我正在尝试为Android重新创建GPUImage(ios)的GPUImageTwoPassFilter。我正在使用这里完成的工作进行Android版GPUImage的移植。对于许多滤镜,移植实际上效果很好。我已经成功地逐行移植了许多着色器。
问题在于,要移植一些滤镜,您必须从GPUImage的GPUImageTwoPassFilter中进行扩展,而Android版本的作者尚未实现它。我想尝试编写它,但不幸的是iOS版本文档非常少,因此我不知道TwoPass过滤器应该做什么。
有人有关于如何解决此问题的提示吗?我对openGL的了解有限,但非常了解Android和iOS。我肯定在这里寻找非常伪代码的描述。

+1 我们需要有人在 Android 上开发这个项目!这是一个非常棒的开源项目,在 iOS 上使用过,现在在 Android 上却没有。 - Daniel Smith
老实说,如果这个过滤器存在,该项目将在Android上立即变得同样有价值。 - Jameo
GPUImageMovieWriter 根据使用情况也非常有价值,但这是一个在 Android 上移植可能会非常困难的领域。 - Daniel Smith
1个回答

7
我想我需要解释一下我的想法。
正如名称所示,这不仅仅是对一个输入图像应用单个操作,而是运行两个着色器传递以对该图像进行处理。为了进行高斯模糊等操作,我使用可分离核来执行一次垂直模糊传递,然后执行一次水平模糊传递(在9个点的模糊中将纹理读取从81个减少到18个)。我还使用它来将图像缩小到其亮度组件以进行边缘检测,尽管我最近使过滤器检测它们是否接收单色内容,以使其成为可选项。
因此,这扩展了基本的GPUImageFilter,使用两个帧缓冲区和两个着色器程序,而不仅仅是每个仅有一个。在第一遍处理时,渲染就像使用标准GPUImageFilter一样发生。但是,在那之后,除了将结果纹理发送到链中的下一个滤镜外,该纹理还将作为第二次渲染通道的输入接受。该滤镜切换到第二个着色器程序并对第一个输出纹理运行该程序以产生第二个输出纹理,最终作为该滤镜的输出传递。
该滤镜仅覆盖了执行此操作所需的GPUImageFilter方法。需要注意的一个棘手问题是,我在滤镜的第一阶段中纠正输入图像的旋转,但是第二个阶段不需要再次旋转图像。这就是为什么第一和第二阶段使用的纹理坐标有所不同的原因。此外,像单向采样的模糊滤波器可能需要根据第一阶段是否旋转图像来翻转其采样输入。
还有一些内存优化和着色器缓存的东西,但是在将其移植到Android时可以安全地忽略这些内容。

除了不必在帧缓冲区中旋转或平移坐标两次(每个通道一次),这与使用过滤器组链接两个过滤器有什么不同吗? - Jameo
@Jameo - 没有显著的影响,我在创建过滤器组概念之前就已经编写了它。由于开销略低,它可能会更快一些,但感受不到。它确实使得你无需为组中的子操作创建自定义过滤器类型,因此可以使框架更加清晰。 - Brad Larson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接