2010-12-17 7 views
5

Dies ist hauptsächlich relevant für Augmented-Reality-Anwendungen. Apple stellt Informationen darüber, wie Video-Frames zu erfassen (und sie als Bilder speichern wenn nötig) mit AVCaptureSession hier:Alternativen zum Erstellen einer OpenGL-Textur aus einem aufgenommenen Videoframe zum Überlagern einer OpenGL-Ansicht über Video? (iPhone)

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

Ich weiß, dass es möglich ist, eine openGL Textur aus einem aufgenommenen Videorahmen zu erstellen und dann Verwenden Sie das als Hintergrund in der OpenGL-Ansicht, über die Sie andere Grafiken überlagern möchten.

Ich frage mich, ob es Alternativen zu dieser Methode gibt? Die oben erwähnte Methode mag die beste sein (ich weiß nicht, ob es das ist), aber wenn es Alternativen gibt, wäre es gut zu wissen. Gibt es zum Beispiel eine Möglichkeit, die OpenGL-Ansicht direkt über AVCaptureVideoPreviewLayer zu überlagern?

Antwort

6

Sie können tatsächlich OpenGL-Inhalt über etwas wie AVCaptureVideoPreviewLayer schichten, aber Ihre Leistung wird darunter leiden. Apple empfiehlt dringend, dass Sie nicht undurchsichtigen OpenGL ES-Inhalt über anderen Anzeigeelementen überlagern. Von der OpenGL ES Programming Guide for iOS:

Für die absolut beste Leistung sollte Ihre Anwendung ausschließlich auf OpenGL ES verlassen Ihre Inhalte zu machen. Zu Größe, die Ansicht, die Ihr CAEAGLLayer-Objekt mit dem -Bildschirm übereinstimmt, setzen Sie seine opaque-Eigenschaft auf YES, und stellen Sie sicher, dass keine anderen Core Animation Ebenen oder Ansichten sichtbar sind. Wenn Ihre OpenGL ES-Schicht über anderen Schichten zusammengesetzt ist, wird Ihr CAEAGLLayer-Objekt undurchsichtig, aber reduziert nicht die Leistung Kosten.

Wenn Ihr CAEAGLLayer Objekt auf den darunter liegenden Schichten in der Schicht Hierarchie vermischt wird, der Farbdaten des renderbuffer in einem premultiplied alpha-Format sein muss korrekt Core Animation zusammengesetzt werden. Blending OpenGL ES Inhalt über andere Inhalt hat eine schwere Leistung Strafe.

Ehrlich gesagt, es ist wirklich nicht so schwer im Video als Textur zu ziehen und dann angezeigt werden, dass als eine Plakatwand hinter dem 3-D-Overlay. Meine Beispielanwendung here führt Passthrough von Kamera-Video zu einer OpenGL ES (2.0) Textur für die Anzeige auf dem Bildschirm. Mit nur wenigen Modifikationen könntest du 3-D Content darüber legen. Dadurch erhalten Sie eine weitaus bessere Leistung, als wenn Sie versuchen würden, nicht deckenden 3D-Inhalt auf einen AVCaptureVideoPreviewLayer zu zeichnen.

Wenn Sie jedoch nur einfache statische UIViews über OpenGL ES-Inhalt anzeigen möchten, kann dies ohne viel Leistungseinbußen (~ 5% Verringerung der Framerate nach meiner Erfahrung) getan werden.

+0

Danke. Ich hatte kein Problem damit, das Video als Textur einzufügen, aber ich war mir nicht sicher, welche Technik die beste Leistung bringen würde (Textur gegen Schichtung erzeugen/binden). Ihre Links zu Apples Dokument und Ihrem eigenen Code sind sehr hilfreich. Ich mache etwas, was dem Code ziemlich ähnlich ist und habe das meiste davon installiert. Vielen Dank. –

+0

~ 5% Reduzierung der Bildrate! –

+0

@BradLarson gibt es irgendein Leistungsproblem, wenn wir AVCaptureVideoPreviewLayer auf OpenGL ES Inhalt setzen? – onmyway133

1

Sicher, Ansichten können zusammengeschichtet werden, unabhängig vom Inhalt. Layering GL über Video ist nicht anders als das Layering 2D über 2D.

Nur der einzige Haken ist, dass Sie Ihren GL-Inhalt so rendern müssen, dass das erzeugte Bild von Alpha vormultipliziert wird (genau wie alle anderen transparenten Inhalte auf iOS vormultipliziert).

+0

Vielen Dank.Ich habe nicht darüber nachgedacht, alles zu Beginn zu multiplizieren. –

Verwandte Themen