iOS 12 CIKernel Фильтры CRASH
Я использую следующий код 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 решает проблему сбоя, но не дает ожидаемого результата.
1 ответ
Как указано в сообщении об ошибке, вы предоставляете неправильный объект
sample(изображение, samplerTransform(изображение, finalUV)).r
Здесь изображение имеет тип __sample
, Но это на самом деле требует sampler
тип.
CIColorKernel действительно ожидает __sample
введите его параметры. Таким образом, вам нужно использоватьCIKernel вместо CIColorKernel. Затем вы можете предоставить сэмплер в вашем ядре.
kernel vec4 customFilter(sampler image, sampler noise, float time, float inputNoise) {