Я знаю, как сделать это наоборот. Но как я могу создать CIImage из текстуры, не копируя ее в память процессора? [Изображение CIImage с данными]? CVOpenGLESTTextureCache?
Как преобразовать текстуру OpenGL ES в CIImage
Ответы (3)
К сожалению, я не думаю, что есть способ избежать необходимости считывать данные пикселей с помощью glReadPixels()
. Все входные данные для CIImage (данные, CGImageRef, CVPixelBufferRef) находятся на стороне процессора, поэтому я не вижу быстрого пути для доставки их в CIImage. Похоже, что вашей лучшей альтернативой будет использование glReadPixels()
для извлечения необработанных данных RGBA из вашей текстуры и отправки их в CIImage с использованием -initWithData:options:
и формата kCIFormatRGBA8
пикселей. (Обновление: 14.03.2012) В iOS 5.0 теперь есть более быстрый способ получения данных кадра OpenGL ES с использованием новых кэшей текстур. Я подробно описываю это в этом ответе.
Однако может быть и другой способ добиться желаемого. Если вы просто хотите применить фильтры к текстуре для вывода на экран, вы можете использовать мою структуру GPUImage для обработки. Он уже использует OpenGL ES 2.0 в качестве ядра своего конвейера рендеринга, а текстуры — это способ передачи кадров изображений или видео от одного фильтра к другому. В моих тестах он также намного быстрее, чем Core Image.
Вы можете предоставить свою текстуру в качестве входных данных здесь, чтобы она никогда не касалась процессора. У меня пока нет стандартного класса для захвата необработанных текстур из OpenGL ES, но вы можете изменить код одного из существующих подклассов GPUImageOutput, чтобы довольно легко использовать его в качестве источника. Затем вы можете связать фильтры с этим и направить вывод на экран или на неподвижное изображение. В какой-то момент я добавлю класс для такого источника данных, но проект все еще довольно новый.
glReadPixels()
на iOS.
- person Brad Larson; 18.02.2012
glReadPixels()
: stackoverflow.com/a/9704392/19679
- person Brad Larson; 14.03.2012
Начиная с iOS 6, вы можете использовать встроенный метод инициализации для этой ситуации:
initWithTexture:size:flipped:colorSpace:
Вы можете найти это полезным:
- https://developer.apple.com/library/ios/#samplecode/RosyWriter/Introduction/Intro.html
- https://developer.apple.com/library/ios/#samplecode/GLCameraRipple/Listings/GLCameraRipple_RippleViewController_m.html
В общем, я думаю, что данные изображения нужно будет скопировать с графического процессора на процессор. Однако упомянутые выше функции iOS могут сделать это проще и эффективнее.