自定义CIKernel,程序超过GLES统一限制,将参数传递给cikernel

时间:2016-01-14 16:18:57

标签: ios swift core-image cifilter

我正在尝试构建一个自定义过滤器,它会实时混淆图像的几何体。我做了一个非常简单的扭曲内核,它将当前圆圈中的每个像素映射到中心像素。经过55次迭代后,程序崩溃说程序超过GLES统一限制。我还注意到崩溃前的迭代次数总是接近55。   那些限制是什么以及如何克服这个问题?    当内核接收参数时会出现问题,没有参数它可以正常工作。有什么想法吗?

内核代码

   "kernel vec2 simpleWarp(vec2 center)                      " +
        "{                                                        " +
        "    vec2 p = destCoord();                                " +
        "    float dist = sqrt (dot( p - center, p - center) );   " +
        "    return dist < 50.0 ? center : p;                     " +
        "}                                                        " ;

1 个答案:

答案 0 :(得分:1)

请就此问题提出雷达错误。

解决方法是在warp内核组之间插入pass-through内核,以防止CI过度连接:

    CIImage* applyPassThrough (CIImage *img)
    {
        static CIKernel *k = nil;
        static NSString * const source = 
              @"kernel vec4 passThrough (sampler s, float v)\n"
               "{ return sample(s, samplerCoord(s)+v); }\n";
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            k = [[CIKernel kernelWithString:source] retain];
        });

        return [k applyWithExtent:img.extent
                      roiCallback:^(int i, CGRect r) { return r; }
                        arguments:@[img, @0.0]];
    }