这可能是一个愚蠢的问题,但我被困在这一段时间,所以无论如何要问它。
我试图在一个宠物项目上实现一个Hudson/Nashville过滤器。我在googled上搜索了几个开源项目,并找到了一些基于Objective-C (我不明白)的项目。他们确实使用GPUImage2实现了过滤器,但我不确定他们的方法。
我有覆盖和其他图像,他们已经使用和GLSL文件。
因此,我的问题是如何使用这些图像和着色器文件来实现自定义过滤器?
注意:我试着按照建议使用LookupFilter方法,但结果并不好。如果你能给我看一些代码,那就太有帮助了。谢谢
更新:
我想要理解的是。给定像下面这样的自定义着色器,我应该如何传递uniform inputImageTexture2、inputImageTexture3和inputImageTexture4的输入图像。我是否通过子类将它作为PictureInput传递给BasicOperation?如果是这样的话,是怎么做的?我遗漏了什么?由于缺乏适当的文档,我无法很好地浏览代码。现在我已经读过关于着色器及其不同组件的文章,但是仍然无法找到在GPUImage2上使用自定义过滤器的方法。请帮帮忙。
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;
}发布于 2017-07-06 02:26:18
GPUImage的惯例是,对着色器的第一个输入纹理称为inputTextureCoordinate,第二个inputTextureCoordinate2,等等。在最初的目标-C版本的GPUImage,您可以手动子类的过滤器类型,以匹配输入纹理的数目在您的着色器。
在Swift GPUImage 2中,我制作了它,这样您只需要使用BasicOperation类或子类,它就会自动将纹理附加到着色器所需的输入数量上。您可以通过初始化一个BasicOperation并设置输入的数量来做到这一点:
let myOperation = BasicOperation(fragmentShaderFile:myFragmentShader, numberOfInputs:4)以上设置的numberOfInputs为4,匹配您的上述着色器。通过将vertexShaderFile参数保留为零(默认),BasicOperation将选择一个具有四个纹理输入的适当的简单顶点着色器。
然后,您所需要做的就是像设置其他过滤器一样,通过添加新的BasicOperation作为图像源的目标,将输入设置到该过滤器。您附加输入的顺序很重要,因为这将从您的着色器中的第一个纹理开始,然后向下移动。
在大多数情况下,BasicOperation具有足够的灵活性,因此不需要子类。最多,您可能需要提供一个自定义顶点着色器,但是上面的片段着色器代码不需要这样做。
https://stackoverflow.com/questions/44871171
复制相似问题