使用GPUImage Swift库实现自定义过滤器

时间:2017-07-02 13:10:47

标签: swift gpuimage fragment-shader imagefilter

这可能是一个愚蠢的问题,但我一直坚持这一点,所以无论如何都要问它。

我正在尝试在宠物项目上实施public class test implements FocusListener{ JFrame frame; SpinnerNumberModel model; JSpinner spinner; JComponent comp; JFormattedTextField field; public test() { JFrame frame = new JFrame("frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); model = new SpinnerNumberModel(0., 0., 100., 0.1); spinner = new JSpinner(model); comp = spinner.getEditor(); field = (JFormattedTextField) comp.getComponent(0); field.addFocusListener(this); frame.getContentPane().add(spinner); frame.getContentPane().add(new JButton("defocus spinner")); //to have something to defocus when testing :) frame.pack(); frame.setVisible(true); } @Override public void focusGained(FocusEvent e) { // TODO Auto-generated method stub //when the values of the field and the spinner don't match, the field should get yellow if(!field.getValue().equals(spinner.getModel().getValue())) { field.setBackground(Color.YELLOW); } } @Override public void focusLost(FocusEvent e) { // TODO Auto-generated method stub //if they match again, reset to white if(!field.getValue().equals(spinner.getModel().getValue())) { field.setBackground(Color.RED); } } } 过滤器。我用google搜索了一些开源项目并找到了一些Hudson/Nashville(我不明白)的项目。他们确实使用Objective-C实现了过滤器,但我不确定他们的方法。

我有他们使用的叠加层和其他图像以及GPUImage2文件。

所以我的问题是如何使用这些图像和着色器文件来实现自定义过滤器?

注意:我尝试按照建议使用GLSL方法,但效果不太好。如果你能告诉我一些代码,那将是非常有用的。感谢

更新

我想要了解这一点。给定下面的自定义着色器,我应该如何传递LookupFilteruniform inputImageTexture2&的输入图像。 inputImageTexture3。我是否通过子类化将其作为inputImageTexture4传递给PictureInput?如果是这样,怎么样?我错过了什么?由于缺乏适当的文档,我无法完成代码。我现在已经阅读了着色器及其不同的组件,但仍然无法找到在BasicOperation上使用自定义过滤器的方法。请帮忙。

GPUImage2

1 个答案:

答案 0 :(得分:3)

GPUImage约定是着色器的第一个输入纹理称为inputTextureCoordinate,第二个inputTextureCoordinate2,依此类推。在原始的Objective-C版本的GPUImage中,您可以手动子类化与着色器中输入纹理数量匹配的过滤器类型。

在Swift GPUImage 2中,我已经做到了这样你只需要使用BasicOperation类或子类,它会自动将纹理附加到着色器所需的输入数量。您可以通过初始化BasicOperation并设置输入数量来执行此操作:

let myOperation = BasicOperation(fragmentShaderFile:myFragmentShader, numberOfInputs:4)

上面将numberOfInputs设置为4,与上面的着色器相匹配。通过将vertexShaderFile参数保留为nil(默认值),BasicOperation将选择一个带有四个纹理输入的适当简单顶点着色器。

通过将新的BasicOperation添加为图像源的目标,您需要做的就是设置对该过滤器的输入。附加输入的顺序很重要,因为它将从着色器中的第一个纹理开始,然后向下进行。

在大多数情况下,BasicOperation足够灵活,因此您不需要子类。最多,您可能需要提供自定义顶点着色器,但上面的片段着色器代码不需要。