首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GPUImage Swift库实现自定义过滤器

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

Stack Overflow用户
提问于 2017-07-02 13:10:47
回答 1查看 1.2K关注 0票数 0

这可能是一个愚蠢的问题,但我被困在这一段时间,所以无论如何要问它。

我试图在一个宠物项目上实现一个Hudson/Nashville过滤器。我在googled上搜索了几个开源项目,并找到了一些基于Objective-C (我不明白)的项目。他们确实使用GPUImage2实现了过滤器,但我不确定他们的方法。

我有覆盖和其他图像,他们已经使用和GLSL文件。

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

注意:我试着按照建议使用LookupFilter方法,但结果并不好。如果你能给我看一些代码,那就太有帮助了。谢谢

更新:

我想要理解的是。给定像下面这样的自定义着色器,我应该如何传递uniform inputImageTexture2inputImageTexture3inputImageTexture4的输入图像。我是否通过子类将它作为PictureInput传递给BasicOperation?如果是这样的话,是怎么做的?我遗漏了什么?由于缺乏适当的文档,我无法很好地浏览代码。现在我已经读过关于着色器及其不同组件的文章,但是仍然无法找到在GPUImage2上使用自定义过滤器的方法。请帮帮忙。

代码语言:javascript
复制
precision highp float;

varying highp vec2 textureCoordinate;

uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2; //blowout;
uniform sampler2D inputImageTexture3; //overlay;
uniform sampler2D inputImageTexture4; //map

uniform float strength;

void main()
{
    vec4 originColor = texture2D(inputImageTexture, textureCoordinate);

    vec4 texel = texture2D(inputImageTexture, textureCoordinate);

    vec3 bbTexel = texture2D(inputImageTexture2, textureCoordinate).rgb;

    texel.r = texture2D(inputImageTexture3, vec2(bbTexel.r, texel.r)).r;
    texel.g = texture2D(inputImageTexture3, vec2(bbTexel.g, texel.g)).g;
    texel.b = texture2D(inputImageTexture3, vec2(bbTexel.b, texel.b)).b;

    vec4 mapped;
    mapped.r = texture2D(inputImageTexture4, vec2(texel.r, .16666)).r;
    mapped.g = texture2D(inputImageTexture4, vec2(texel.g, .5)).g;
    mapped.b = texture2D(inputImageTexture4, vec2(texel.b, .83333)).b;
    mapped.a = 1.0;

    mapped.rgb = mix(originColor.rgb, mapped.rgb, strength);

    gl_FragColor = mapped;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 02:26:18

GPUImage的惯例是,对着色器的第一个输入纹理称为inputTextureCoordinate,第二个inputTextureCoordinate2,等等。在最初的目标-C版本的GPUImage,您可以手动子类的过滤器类型,以匹配输入纹理的数目在您的着色器。

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

代码语言:javascript
复制
let myOperation = BasicOperation(fragmentShaderFile:myFragmentShader, numberOfInputs:4)

以上设置的numberOfInputs为4,匹配您的上述着色器。通过将vertexShaderFile参数保留为零(默认),BasicOperation将选择一个具有四个纹理输入的适当的简单顶点着色器。

然后,您所需要做的就是像设置其他过滤器一样,通过添加新的BasicOperation作为图像源的目标,将输入设置到该过滤器。您附加输入的顺序很重要,因为这将从您的着色器中的第一个纹理开始,然后向下移动。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44871171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档