В правилах :)
Ведь фильтры могут применяться непосредственно во время съемки, а там каждый кадр рендерить в превьюшки, потом накладывать фильтры… ух, даже думать не хочу :)
Правила, там, вроде, были менее жёсткие.
Я, например, забил на GPUImage (он толстый, тормозной и проблемный) и написал свой процессор цепочек эффектов с известно кем и чем, который позволил, среди всего прочего, показывать маленькие превьюшки всех доступных эффектов в реальном времени на плавных 30фпс (можно было сделать и все 60, но из самой камеры изображения приходят реже и неустойчивей).
Правда, это хороший пример того, как не надо было делать за два дня до дедлайна :D — когда у меня была готова core-часть с эффектами и захватом, оставался час, и не было уже никакого смысла даже браться за весь остальной гуй и функции.
Пока не знаю. Он (а) так себе чистый, (б) на плюсах с лёгким налётом си-стайла, (в) не шибко интересный — там много всякого сетапа и скукоты, суть тяжело добыть.
Могу, впрочем, поделиться некоторыми идеями:
1) По-максимум объединять шейдеры. Один эффект = один шейдер. Действительно, как вы говорили выше, цепочки эффеков тормозят. 640х480 превью не укладывается в 60фпс уже после трёх звеньев, наступает няшная боттлнека по памяти. Можно вообще написать либо убершейдер со всем и поставлять ему параметры, или написать синтезатор шейдеров. Я, впрочем, этого не делал — проще написать заново/скопипастить матрицы для RGB-YUV. И есть одно исключение — блюр, его надо делать в два этапа, причем тащить координаты сэмплов текстуры из вершинного шейдера как varying, не делая расчетов во фрагментном шейдере.
2) Пул переиспользуемых объектов. Все эффекты на самом деле работают на одном фреймбуфере с двумя пинг-понг текстурами. Самим звеньям-эффектам свои текстуры нафиг не нужны :D.
3) Для превью сразу делать маленькую текстуру с маленьким же фреймбуфером, а потом уже применять эффекты.
Как разработать свой фоторедактор для iOS. Отчет по конкурсу ВКонтакте