Как преобразовать текстуру OpenGL ES в CIImage - PullRequest
3 голосов
/ 26 января 2012

Я знаю, как это сделать наоборот.Но как я могу создать CIImage из текстуры, не копируя в память процессора?[CIImage imageWithData]?CVOpenGLESTextureCache

Ответы [ 3 ]

4 голосов
/ 18 февраля 2012

К сожалению, я не думаю, что есть какой-то способ избежать необходимости считывать данные пикселей с помощью 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, чтобы довольно легко использовать его в качестве источника.Затем вы можете связать фильтры с этим и направить вывод на экран или на неподвижное изображение.В какой-то момент я добавлю класс для такого рода источника данных, но проект все еще довольно новый.

2 голосов
/ 20 июля 2013

Начиная с iOS 6, вы можете использовать встроенный метод init для этой ситуации:

initWithTexture:size:flipped:colorSpace:

См. Документы: http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIImage_Class/Reference/Reference.html

0 голосов
/ 17 февраля 2012

Вам может пригодиться:

В общем, я думаю, что данные изображения должны бытьскопировал из GPU в CPU.Однако упомянутые выше функции iOS могут сделать это проще и эффективнее.

...