2012-04-04 5 views
0

Я работаю над приложением для обработки изображений для iOS, и один из различных этапов моего приложения - это вставка/распознавание цвета на основе вектора.iOS CGImageRef Pixel Shader

Теперь я написал код, который может на пиксель определять постерилизованный цвет, но, по-моему, через каждый пиксель в изображении будет очень сложно процессор, если iOS. Поэтому мне было интересно, можно ли вместо этого использовать графический процессор;

Я хотел бы создать своего рода «пиксельный шейдер», который использует OpenGL-ES или какую-либо другую технологию рендеринга для обработки и постеризации изображения быстро. Я не знаю, с чего начать (я написал простые шейдеры для Unity3D, но никогда не делал базового программирования для них).

Может ли кто-нибудь указать мне правильное направление?

ответ

2

Я собираюсь подойти к этому сбоку и предложить вам попробовать GPUImage framework Брэда Ларсона, который описывает себя как «лицензионную лицензию на iOS-библиотеку BSD, которая позволяет применять фильтры с ускорением GPU и другие эффекты для изображений, видео в реальном времени , и фильмы ". Я не использовал его и предполагаю, что вам нужно будет сделать чтение GL, чтобы добавить свою собственную фильтрацию, но она будет обрабатывать так много компонентов шаблонов и предоставляет так много предварительно упакованных фильтров, которые, безусловно, стоит посмотреть. Не похоже, что вы в особенности заинтересованы в OpenGL, поэтому нет никакой реальной причины для этого.

Я добавлю единственное соображение, что в iOS 4 я часто быстрее работал над процессором (используя GCD для его распространения среди ядер), чем на графическом процессоре, где мне нужно было прочитать результаты на конец для любого вида последовательного доступа. Это потому, что OpenGL обычно разработан так, что вы загружаете изображение, а затем преобразуете его в любой формат, который требуется, и если вы хотите его прочитать, он преобразует его обратно в тот формат, который вы ожидаете получить, и копирует его туда ты хочешь это. Итак, что вы экономите на графическом процессоре, за который вы платите, потому что драйвер GL должен шунтировать и переупорядочивать память. Начиная с iOS 5 Apple представила специальный механизм, который эффективно дает вам прямой доступ к процессору в хранилище текстур OpenGL, так что, вероятно, это уже не проблема.

+2

В какой-то момент мне нужно проверить, где кроссовер времени обработки находится на этом как функция входных данных, особенно если вы учитываете Ускорение как средство распараллеливания некоторых операций с ЦП. Я думаю, что я вижу общую победу на iOS 4.0 при обработке кадров 640x480, исходящих из CGImage или UIImage на графическом процессоре, а также оптимизированных функций, связанных с процессором, но для этого мне нужно создать некоторые жесткие цифры. Преобразование в и из основных типов графических карт намного медленнее, чем загрузка текстур, так что это скорее узкое место для меня. –

+0

Мои подпрограммы процессора никогда не доходили до Core Graphics; они были для входа в живую камеру, поэтому работали непосредственно на 'CVPixelBuffer', как было возвращено камерой. У меня были быстрые вопросы и ответы с Аланом Шаффером на последнем WWDC на Tour, и он, похоже, признал, что, несмотря на то, что распознавание лица iOS 5 требует взаимодействия с GPU, никакой публичный API не будет подходящим для переоценки его из-за дополнительных затрат. В то время я не знал о новом механизме, связанном с Core Video, который эффективно дает вам прямой доступ к текстурной памяти, поэтому он не обсуждался. – Tommy

+0

Да, работа с рамками камеры в OpenGL ES может быть намного быстрее, чем что-либо связанное с процессором. Для простой регулировки тона сепии на изображении 640x480 я мог бы запустить это от захвата до отображения через 6 мс на iPhone 4 (2,5 мс с кешами текстур iOS 5.0), где ничто на CPU не может приблизиться. Что касается распознавания лиц, то эта реализация полностью на GPU OpenGL ES 2.0 очень интересна: http://fileadmin.cs.lth.se/graphics/theses/projects/facerecognition/. В какой-то момент я хотел бы попробовать. –