Замена пользовательского CIFilter в iOS 12.

Поскольку iOS 12 CIColorKernel (источник: «строка ядра») устарела. Кто-нибудь из вас знает, что является заменой Apple для этого?

Я ищу собственный CIFilter в Swift. Может быть, есть библиотека с открытым исходным кодом?


person Terus    schedule 25.10.2018    source источник
comment
Начиная с iOS 12 CIColorKernel обновляется с помощью CIKernel и CIWarpKernel, вы можете проверить подробности в документации. developer.apple.com/metal/   -  person Rahul    schedule 25.10.2018
comment
Спасибо, это был правильный путь. На данный момент это: developer.apple.com/documentation/coreimage/cikernel помогает мне   -  person Terus    schedule 25.10.2018
comment
Просто предупреждаю, если вы поддерживаете iOS 12: iPad Air 1 работает под управлением iOS 12, но не может использовать MSL (язык затенения металла), поскольку для MSL, по-видимому, требуется процессор A8 или новее (iPad Air 1 имеет A7). Источник: WWDC 2017 510 — asciiwwdc.com/2017/sessions/510   -  person xaphod    schedule 25.10.2019


Ответы (3)


Еще на WWDC 2017 было объявлено, что пользовательские фильтры также могут быть написаны с помощью языка Metal Shading — https://developer.apple.com/documentation/coreimage/writing_custom_kernels

Так что теперь, по-видимому, они полностью избавляются от Core Image Kernel Language.

Вот краткое введение в написание CIColorKernel с помощью Metal — https://medium.com/@shu223/core-image-filters-with-metal-71afd6377f4

Писать ядра с помощью Metal на самом деле проще, единственная загвоздка в том, что вам нужно указать 2 флага компилятора в проекте (см. статью выше).

person Maxim Volgin    schedule 27.10.2018
comment
Спасибо, я нашел также этот учебник. Но я застрял с: xcrun metal -fcikernel Filter.metal -o Filter.air xcrun metallib -cikernel Filter.air -o Filter.metallib stackoverflow.com/questions/52992783/ - person Terus; 28.10.2018
comment
Где именно застрял? - person Maxim Volgin; 28.10.2018
comment
Пока я пытаюсь изменить файл .air на .metallib, я просто получаю: metallib: Ошибка чтения модуля: неверная подпись битового кода - person Terus; 28.10.2018
comment
Посмотрите здесь: medium.com/@shu223/core-image-filters -with-metal-71afd6377f4 и developer.apple.com/metal/MetalCIKLReference6.pdf Страница 9 Я выполнил эти шаги, и команды такие же, как и параметр сборки. С CIKernel мне нужен .metal для ядра, чтобы построить мой собственный CIFilter. - person Terus; 28.10.2018
comment
Я до сих пор не понимаю часть .air. Очевидно, что его формат отличается от .metallib. Если у вас есть фильтр, написанный на языке Core Image Kernel, вам нужно будет переписать его на языке Metal Shading Language с нуля. - person Maxim Volgin; 28.10.2018
comment
Я написал файл .metal с ядром. Я скомпилировал его в файл air, и следующим шагом будет его компиляция в metallib для использования в проекте. Для создания CIKernel мне нужен файл metallib. Именованные флаги делают то же самое, но сначала я хочу проверить через терминал, где я получаю сообщение об ошибке. - person Terus; 28.10.2018
comment
Я понимаю. Я никогда не использовал CLI для этой цели, только настройки сборки проекта Xcode. В проекте работает нормально. Что касается CLI, я прокомментировал ваш другой вопрос - stackoverflow.com/questions/52992783/ - person Maxim Volgin; 28.10.2018

Я пытался следовать этим сообщениям в блоге и документам Apple, но эта интеграция между CoreImage и Metal довольно запутана. После долгих поисков я создал фактически работающий пример iOS, демонстрирующий, как написать ядро ​​Metal. функцию оттенков серого и заставьте ее обрабатывать конвейер CoreImage.

person MoDJ    schedule 26.11.2018

Вы можете использовать его следующим образом:

 let url = Bundle.main.url(forResource: "default", withExtension: "metallib")!
 let data = try! Data(contentsOf: url)
 let kernel = try! CIKernel(functionName: "monochrome", fromMetalLibraryData: data)
 let sampler = CISampler(image: inputImage)
 let outputImage = kernel.apply(extent: image.extent, roiCallback: { _, rect in rect }, arguments: [sampler])

Согласно Apple: "Вам необходимо установить эти флаги, чтобы использовать MSL в качестве языка шейдеров для CIKernel. Вы должны указать некоторые параметры в Xcode на вкладке «Параметры сборки» цели вашего проекта. Первый параметр, который вам нужно указать, — это флаг -fcikernel в параметре «Другие флаги металлического компилятора». Второй — добавить пользовательская настройка с ключом MTLLINKER_FLAGS со значением -cikernel: введите здесь описание изображения

person Ozgur Sahin    schedule 27.05.2020