Искажение вида в iOS с помощью Metal - PullRequest
0 голосов
/ 26 июня 2018

Вопрос:

Как я могу захватить вид, который будет изменен в металле?

Мое (возможно, неполное) понимание состоит в том, что мне нужно захватить вид как текстуру, переместить его в память устройства, выполнить работу с шейдерами и затем отобразить его обратно в вид. В настоящее время я застрял на первом этапе захвата изображения. Задача этого вопроса заключается только в том, чтобы захватить текстуру и получить ее в Metal. Если я столкнусь с проблемами с шейдерами, я открою для этого отдельный вопрос.

Если есть более простой способ сделать это, чем перейти на уровень GPU, я открыт для предложений.

Справка:

В целях обучения я пытаюсь воссоздать эффект ряби, показанный в этом коротком ролике с металлом (без использования Qt и OpenGL, как в видео). Насколько я понимаю, мне нужен вершинный шейдер и фрагментный шейдер. Я думаю, что смогу перевести шейдеры openGL в репо в Metal с некоторыми экспериментами.

Apple предоставляет очень похожую анимацию для iOS, CATransition "rippleEffect", поэтому это представляется возможным, но используемые ими API являются частными и, вероятно, отклонят ваше приложение из магазина приложений.

Я также сталкивался с BCMeshTransformView , который, кажется, очень похож на то, что я хочу сделать, но мне не повезло, пытаясь выяснить, как это работает из источника.

Я потратил пару часов на поиск документации, но в целом я такой новичок в графике, что, вероятно, не гуглю правильные термины.

1 Ответ

0 голосов
/ 26 июня 2018

Самый простой способ сделать это - использовать CoreImage . CI предлагает очень широкий спектр эффектов, которые довольно легко можно применить к вашему виду (вот полный список ).

Если ни один из них не работает для вас, вы можете написать пользовательский CIFilter , используя GLSL (язык затенения OpenGL), который будет работать непосредственно на GPU.

Вы можете применить данный CIFilter к UIView, захватив UIImage вида, преобразовав его в CIImage, запустив фильтр, а затем показав CIImage на экране. Я полагаю, что это будет проще, чем пытаться сделать это с Metal, который является гораздо более низким уровнем API.

Пример кода CoreImage, который делает это, см. Как применить CIFilter к UIView?

...