Как вы можете применить искажения к UIImage, используя OpenGL ES?

Есть ли способ создать такие эффекты, как вмятины, защемление, скручивание, сжатие и т. Д. На UIImage с использованием OpenGL ES, как в приложении для iPhonePhotoTwist?

Есть ли какие-либо ссылки или рекомендации для этого? Я не хочу код, просто справка о том, как это сделать.

 HarshIT27 мар. 2012 г., 13:57
увидев это, сохранив пульсацию, вы получите такой же эффект, какой хотите на самом делеstackoverflow.com/questions/9765709/...

Ответы на вопрос(2)

nnection делает именно эту вещь.

 Brad Larson♦21 окт. 2015 г., 17:02
Я ответил на это в другом месте, но уточнить, что вы написали выше, неglslang, этоБазовый язык ядра, Язык ядра Core Image, хотя и основан на GLSL (glslang), является проприетарным и имеет определенные ограничения, которых нет у GLSL. Например, оператор if () времени выполнения в приведенном выше коде предотвратит компиляцию и запуск в Core Image.
Решение Вопроса

зование шейдеров OpenGL ES 2.0. Еще раз, если бы я мог указать вам на мойGPUImage Framework, он может выполнять многие операции искажения, которые вы описываете. Для тех, кто отсутствует, вы можете написать свои собственные фрагменты шейдеров.

Я получаю эффекты выпуклого выпуклого искажения (используя GPUImageBulgeDistortionFilter):

вогнутое искажение (используя инвертированный масштабный параметр к предыдущему фильтру):

вихревое искажение (используя GPUImageSwirlFilter):

и, наконец, искажение пинч (используя GPUImagePinchDistortionFilter):

Если вы посмотрите на шейдеры, используемые для каждого из фильтров, вы обнаружите, что математика очень похожа между ними. Вы должны быть в состоянии настроить это, чтобы производить свои собственные пользовательские эффекты из этой же базы.

Довольно легко применить эти фильтры к UIImages. Если у вас есть только один фильтр, который вы хотите использовать, вы можете сделать что-то вроде следующего:

UIImage *inputImage = [UIImage imageNamed:@"test.jpg"];
GPUImageBulgeDistortionFilter *stillImageFilter = [[GPUImageBulgeDistortionFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter imageByFilteringImage:inputImage];

Это создаст UIImage с диска, использует OpenGL ES для его фильтрации и вернет отфильтрованный UIImage для работы с вами. Вы можете использовать GPUImagePicture и пользовательский конвейер фильтрации, если вы хотите выполнять более сложные цепочечные эффекты, или вы можете использовать другой источник входного сигнала для фильтрации видео или фильмов с камеры в реальном времени.

Исходный код этого проекта доступен по вышеуказанной ссылке под лицензией BSD, так что вы можете изучить его, чтобы узнать, как передавать данные в OpenGL ES и из него и как выполнять фильтры такого типа.

 Robert17 апр. 2012 г., 15:22
Фантастика. Спасибо :)
 AAnkit10 мар. 2013 г., 13:00
@BradLarson есть ли такая библиотека для Android?
 Ajay Sharma14 сент. 2012 г., 06:42
Отличное решение с хорошим объяснением, включая пример. Мне нравится +10 от myside;)
 Brad Larson♦16 апр. 2012 г., 22:07
@ Роберт - Вы хотите интерполировать между начальной и конечной точкой любого значения, которое анимируется в течение установленного времени. Для каждого нового кадра установите свойство в фильтре. Для фильма это будет автоматически применено к следующему входящему видеокадру, но вам может потребоваться принудительный повторный рендеринг статического изображения, используя-processImage.
 Robert16 апр. 2012 г., 21:42
GPUImage - отличная библиотека! Я получил фильтры, работающие со статическим изображением, но теперь мне интересно, как лучше всего плавно анимировать искажение?

Ваш ответ на вопрос