iOS 12 Фильтры 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;

похоже, это происходит во всех CIColorKernel, использующих __sample. Однако использование sampler вместо __sample и замена CIColorKernel на CIKernel устраняет сбой, но не дает ожидаемого результата.


person Abhishek Dave    schedule 03.10.2018    source источник
comment
Каков желаемый эффект? Я собрал очень простой пример — одно изображение, используемое в качестве обоих входных данных, и число с плавающей запятой 0 в качестве обоих входных данных с плавающей запятой, и да, CIColorKernel работало в iOS 11, но iOS 12 уловила тот факт, что это должно быть либо CIWarpKernel, либо CIKernel. И да, вам нужно сделать ввод типа сэмплера. Это работало в iOS 12. Вот странная вещь: цветовые ядра работают только с одним пикселем за раз, и ваш код ожидает доступ к окружающим пикселям. (1) Как это может работать как цветовое ядро? (2) Как обычное ядро, оно искажает изображение как в iOS 11/12.   -  person dfd    schedule 03.10.2018
comment
Другими словами, он должен был дать сбой во всех версиях iOS! :-) Если вы объясните, каков желаемый эффект, вместе с некоторыми входными примерами, я посмотрю, смогу ли я помочь.   -  person dfd    schedule 03.10.2018


Ответы (1)


Как указано в ошибке, вы предоставляете неправильный объект для

образец (изображение, SamplerTransform (изображение, finalUV)).r

Здесь изображение имеет тип __sample. Но на самом деле требуется тип sampler.

CIColorKernel ожидает тип __sample в своих параметрах. Таким образом, вам нужно использовать CIKernel вместо CIColorKernel. Затем вы можете добавить сэмплер в ядро.

 kernel vec4 customFilter(sampler image, sampler noise, float time, float inputNoise) {
person GeneCode    schedule 07.11.2018
comment
преобразование CIColorKernel в CIkernel действительно решает мою проблему. но что меня смущает, так это то, почему один и тот же фрагмент кода отлично работает с устройствами iOS 10,11. код застревает только на устройстве iOS 12. - person Abhishek Dave; 16.11.2018