【问题标题】:iOS 12 CIKernel Filters CRASHiOS 12 CIKernel 过滤器崩溃
【发布时间】:2019-03-08 11:02:42
【问题描述】:

我正在使用以下 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 可以解决崩溃问题,但不会产生预期的结果。

【问题讨论】:

  • 想要的效果是什么?我整理了一个非常简单的示例 - 单个图像用作输入,浮点“0”用作两个浮点输入,是的,CIColorKernel 在 iOS 11 中“工作”,但 iOS 12 发现它需要是CIWarpKernelCIKernel。是的,您需要将输入设为采样器类型。它在 iOS 12 中“有效”。奇怪的是 - 颜色内核一次只能在 单个 像素上工作,并且您的代码期望能够访问周围的像素。 (1) 它如何作为颜色内核工作? (2) 作为一个通用内核,它在两个 iOS 11/12 中都“倾斜”了图像。
  • 换句话说,它应该在iOS的所有版本中崩溃! :-) 如果您解释所需的效果是什么 - 以及一些输入示例 - 我会看看我是否可以提供帮助。

标签: ios core-image cifilter cikernel


【解决方案1】:

正如错误所述,您向

提供了错误的对象

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

这里的图像类型为__sample。但它实际上需要sampler 类型。

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

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

【讨论】:

  • 将 CIColorKernel 转换为 CIkernel 确实解决了我的问题。但令我困惑的是,为什么同一段代码在 iOS 10,11 设备上运行得非常好。该代码仅停留在 iOS 12 设备上。
猜你喜欢
  • 2020-11-05
  • 2019-03-08
  • 2019-05-15
  • 2023-04-05
  • 1970-01-01
  • 2021-01-13
  • 2019-02-21
  • 2019-03-23
  • 2023-03-24
相关资源
最近更新 更多