iOS 12 CIKernel滤镜崩溃

4
我正在使用以下CIColorKernel代码生成自定义滤镜。
 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可以解决崩溃问题,但不会生成预期的结果。

想要达到什么效果?我组合了一个非常简单的例子 - 一个单一的图像用作两个输入和一个浮点数“0”作为两个浮点输入,是的,CIColorKernel在iOS 11中“工作”,但iOS 12发现它需要是CIWarpKernelCIKernel。而且,你需要将输入设置为采样器类型。它在iOS 12中“工作”。这里有个奇怪的事情 - 颜色内核只能一次处理一个像素,而你的代码希望访问周围的像素。(1)它如何作为颜色内核工作?(2)作为通用内核,在iOS 11/12中都会“扭曲”图像。 - user7014451
换句话说,它应该在所有版本的iOS中崩溃! :-) 如果您解释所需的效果-以及一些输入示例-我会看看是否能够帮助。 - user7014451
1个回答

2
根据错误提示,您提供的对象不正确,应该是:

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

这里的image类型为__sample,而实际上需要的是sampler类型。

CIColorKernel在其参数中期望__sample类型。因此,您需要使用CIKernel而不是CIColorKernel。然后您可以在内核中提供sampler。

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

将CIColorKernel转换为CIkernel确实解决了我的问题。但令我困惑的是,为什么相同的代码在iOS 10、11设备上完美运行,而只有在iOS 12设备上卡住了。 - Abhishek Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接