Альтернативы созданию текстуры openGL из захваченного видеокадра для наложения представления openGL на видео? (IPhone) - PullRequest
5 голосов
/ 17 декабря 2010

Это в основном относится к приложениям типа дополненной реальности.Apple предоставляет информацию о том, как захватывать видеокадры (и при необходимости сохранять их как изображения) с помощью AVCaptureSession:

http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html

Я знаю, что можно создать текстуру openGL иззахваченный видеокадр, а затем использовать его в качестве фона в представлении openGL для наложения другой графики.

Мне интересно, есть ли альтернативы этому методу?Метод, упомянутый выше, может быть лучшим (я не знаю, так ли это), но если есть альтернативы, было бы полезно узнать.Например, есть ли способ наложения представления openGL непосредственно поверх AVCaptureVideoPreviewLayer?

Ответы [ 2 ]

6 голосов
/ 18 декабря 2010

Вы действительно можете наложить контент OpenGL на что-то вроде AVCaptureVideoPreviewLayer, но ваша производительность пострадает. Apple настоятельно рекомендует не накладывать непрозрачный контент OpenGL ES поверх других элементов дисплея. Из OpenGL ES Руководство по программированию для iOS :

За лучшую производительность, Ваша заявка должна опираться исключительно на OpenGL ES для визуализации вашего контента. к сделать это, размер представления, которое содержит ваш Объект CAEAGLLayer, соответствующий экран, установите его непрозрачное свойство в ДА, и убедитесь, что нет другого ядра Анимационные слои или виды видны. Если ваш слой OpenGL ES составлен поверх других слоев, делая ваш Объект CAEAGLLayer непрозрачный уменьшает, но не устраняет производительность стоимость.

Если ваш объект CAEAGLLayer смешан поверх слоев под ним в иерархия слоев, рендер-буфер данные о цвете должны быть предварительно умножены альфа-формат для компоновки правильно по основной анимации. смешивание Содержимое OpenGL ES поверх других контент имеет серьезную производительность штраф.

Честно говоря, на самом деле не так уж сложно вставить видео в качестве текстуры, а затем отобразить его в виде рекламного щита за трехмерным наложением. Мой пример приложения здесь выполняет передачу видео с камеры на текстуру OpenGL ES (2.0) для отображения на экране. С помощью всего лишь нескольких модификаций вы можете поместить трехмерный контент поверх этого. Это даст вам гораздо лучшую производительность, чем попытка рисовать непрозрачный трехмерный контент поверх AVCaptureVideoPreviewLayer.

Однако, если вы просто хотите отобразить простые статические UIViews поверх контента OpenGL ES, это можно сделать без значительного снижения производительности (на моем опыте снижение частоты кадров ~ 5%).

1 голос
/ 17 декабря 2010

Конечно, представления могут быть наслоены вместе, независимо от содержимого.Слои GL над видео ничем не отличается от наложения 2D на 2D.

Единственный улов в том, что вам нужно визуализировать ваш контент GL так, чтобы полученное изображение было предварительно умножено на альфа (как и любой другой прозрачный контентiOS предварительно умножается).

...