iOS 12 CIKernel过滤器崩溃

时间:2018-10-03 08:55:15

标签: ios core-image cifilter cikernel

我正在使用以下CIColorKernel代码生成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); 
}

这段代码可在iOS 10 / iOS 11设备上正常运行。它在iOS 12设备上产生了奇怪的崩溃

  

[CIKernelPool] 16:40:错误:参数具有意外的类型'vec4'(应为采样器类型)   col.r = sample(image,samplerTransform(image,finalUV))。r;

     

[CIKernelPool] 17:40:错误:参数具有意外的类型'vec4'(应为采样器类型)   col.g = sample(image,samplerTransform(image,finalUV))。g;

     

[CIKernelPool] 18:40:错误:参数具有意外的类型'vec4'(应为采样器类型)   col.b = sample(image,samplerTransform(image,finalUV))。b;

这似乎发生在所有使用__sample的CIColorKernel中。但是,使用sampler代替__sample并将CIColorKernel覆盖到CIKernel可以解决崩溃问题,但不会产生预期的结果。

1 个答案:

答案 0 :(得分:1)

如错误所述,您正在向

提供错误的对象
  

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

此处的图片类型为__sample。但这实际上需要sampler类型。

CIColorKernel 确实希望在其参数中输入__sample类型。因此,您需要使用 CIKernel ,而不是 CIColorKernel 。然后,您可以在内核中提供采样器。

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