К сожалению, я не думаю, что есть какой-то способ избежать необходимости считывать данные пикселей с помощью glReadPixels()
.Все входные данные для CIImage (data, CGImageRef, CVPixelBufferRef) находятся на стороне процессора, поэтому я не вижу быстрого пути доставки этого к CIImage.Похоже, ваша лучшая альтернатива - использовать glReadPixels()
для извлечения необработанных RGBA-данных из вашей текстуры и отправки их в CIImage, используя -initWithData:options:
и kCIFormatRGBA8
формат пикселей.(Обновление: 14.03.2012) В iOS 5.0 теперь есть более быстрый способ получения данных фрейма OpenGL ES с использованием новых текстурных кешей.Я подробно описываю это в этом ответе .
Однако может быть другой способ добиться того, чего вы хотите.Если вы просто хотите применить фильтры к текстуре для вывода на экран, вы можете использовать my GPUImage framework для выполнения обработки.Он уже использует OpenGL ES 2.0 в качестве ядра своего конвейера рендеринга, а текстуры - это способ передачи кадров изображений или видео от одного фильтра к другому.В моих тестах это также намного быстрее, чем Core Image.
Вы можете указать здесь свою текстуру, чтобы она никогда не касалась процессора.У меня еще нет класса для сбора необработанных текстур из OpenGL ES, но вы можете изменить код одного из существующих подклассов GPUImageOutput, чтобы довольно легко использовать его в качестве источника.Затем вы можете связать фильтры с этим и направить вывод на экран или на неподвижное изображение.В какой-то момент я добавлю класс для такого рода источника данных, но проект все еще довольно новый.