Search code examples
ioscore-imagecifiltercikernel

iOS 12 CIKernel Filters CRASH


I am using Following CIColorKernel Code to generate customFilter.

 kernel vec4 customFilter(__sample image, __sample noise, float time, float inputNoise) { 
 vec2 uv = destCoord() / 1280.0; 
 float d = length(uv - vec2(0.5,0.5));

 float blur = inputNoise; 
 float myTime = time * 1.0;

 vec2 myuv =  vec2(uv.x + sin( (uv.y + sin(myTime)) * abs(sin(myTime) + sin(2.0 * myTime) + sin(0.3 * myTime) + sin(1.4 * myTime) + cos(0.7 * myTime) + cos(1.3 * myTime)) * 4.0 ) * 0.02,uv.y) ;

 vec2 finalUV = myuv * 1280.0; 
 vec3 col; col.r = sample(image, samplerTransform(image, finalUV)).r; col.g = sample(image, samplerTransform(image, finalUV)).g; col.b = sample(image, samplerTransform(image, finalUV)).b;

 float scanline = sin(uv.y * 1280.0 *400.0)*0.08; col -= scanline;

// vignette
 col *= 1.0 - d * 0.5;

 return vec4(col, 1.0); 
}

this piece of code works fine with iOS 10 / iOS 11 devices, However. It generate weird crash with iOS 12 Device

[CIKernelPool] 16:40: ERROR: parameter has unexpected type 'vec4' (should be a sampler type) col.r = sample(image, samplerTransform(image, finalUV)).r;

[CIKernelPool] 17:40: ERROR: parameter has unexpected type 'vec4' (should be a sampler type) col.g = sample(image, samplerTransform(image, finalUV)).g;

[CIKernelPool] 18:40: ERROR: parameter has unexpected type 'vec4' (should be a sampler type) col.b = sample(image, samplerTransform(image, finalUV)).b;

this seem to happen in all CIColorKernel using __sample. However using sampler in place of __sample and coverting CIColorKernel to CIKernel solves the crash but it doesn't generating the expected result.


Solution

  • As the error stated, you are supplying wrong object to the

    sample(image, samplerTransform(image, finalUV)).r

    Here image is of type __sample. But it actually requires sampler type.

    CIColorKernel does expect __sample type in its parameters. Thus, what you need is to use CIKernel instead of CIColorKernel. Then you can supply sampler in your kernel.

     kernel vec4 customFilter(sampler image, sampler noise, float time, float inputNoise) {