2013-02-05 108 views
7

我正尝试从Android的GPUImage(ios)重新创建GPUImageTwoPassFilter。我正在关闭GPUImage的Android Port the work done here。该港口实际上对许多过滤器来说效果很好。我已经移植了许多着色器,基本上排队获得巨大成功。TwoPassFilter GPUImage实际上做了什么?

的问题是,对某些端口过滤器,你必须从GPUImage的GPUImageTwoPassFilter,其Android版本的作者没有实现还延伸。我想刺探一下,但不幸的是,iOS版本没有文档,所以我不确定TwoPass过滤器应该做什么。

有没有人有任何提示去做这件事?我对openGL有一定的了解,但对Android和iOS非常了解。林肯定寻找一个非常psudocode描述在这里

+0

+1我们需要有人为此工作的人为Android!这是一个了不起的开源项目,已经用它在iOS和失踪它在Android –

+0

老实说,如果该过滤器的存在,该项目将是'GPUImageMovieWriter'也是极有价值的根据使用情况在Android – Jameo

+0

瞬间同样价值不菲,但这是一个移植到Android的区域可能被证明是非常困难的 –

回答

6

我想我这里需要说明一下我的想法。

正如其名称所示,而不是仅仅将单个操作来输入图像,这个运行针对该图像,一前一后的着色器两次通过。这是高斯模糊操作所需要的,我使用可分离的内核执行一个垂直模糊通道,然后是水平模式(在9点模糊中将纹理读数从81减少到18)。我也使用它来减少图像到它们的亮度分量以进行边缘检测,尽管我最近使滤镜检测到它们是否接收单色内容以使其成为可选项。

因此,该延伸基部GPUImageFilter使用两个帧缓冲区和两个着色器程序,而不是仅仅每个中的一个。在第一遍中,渲染就像使用标准的GPUImageFilter一样。但是,最后,不是将结果纹理发送到链中的下一个过滤器,而是将该纹理作为第二个渲染过程的输入。过滤器切换到第二个着色器程序,并针对第一个输出纹理运行该过滤器,以产生第二个输出纹理,最终作为该过滤器的输出传递。

该过滤器仅覆盖执行此操作所需的GPUImageFilter方法。需要注意的一件棘手事情是,我在输入图像的第一阶段旋转时进行了校正,但第二阶段不需要再次旋转图像。这就是为什么用于第一和第二阶段的纹理坐标有所不同。另外,类似单向采样的模糊滤波器可能需要使其采样输入翻转,这取决于第一级是否旋转图像。

也有一些有内存优化和着色器缓存的东西,但这个移植到Android时,你可以放心地忽略这些。

+0

除了不必在帧缓冲区中旋转或平移坐标两次(每次传递一个坐标)之外,这与任何使用过滤器组? – Jameo

+0

@Jameo - 不显着,没有。在我创建过滤器组之前,我写了它作为一个概念。这可能是一个更快的头发,因为开销较小,但不是一个可感知的数量。它的确如此,所以你不需要为组中的子操作创建自定义的过滤器类型,所以它可以使框架变得更简洁。 –

相关问题