Schließlich möchte ich einen Shader erstellen, der das Video für mich in Schwarz-Weiß konvertieren kann (und dann einige andere Effekte anwende, von denen ich nicht sicher bin, ob ich sie preisgeben sollte), einfach weil dies auf der CPU geschieht hol mich um 1 Frame pro Sekunde.
Wie auch immer, im Moment möchte ich einfach die Videoframes auf dem Bildschirm anzeigen. Ich kann Dreiecke auf den Bildschirm zeichnen, also weiß ich, dass meine OpenGL-Ansicht korrekt funktioniert, und ich bekomme NSLogs von
%Vor%Methode. Mit dieser Methode versuche ich, alle Zeichnungen zu erstellen. Leider mache ich etwas falsch ... und der Kamerarahmen zeichnet nicht.
Hier ist mein einfacher Vertex-Shader:
%Vor%(Ich weiß, dass es kompiliert wird und wieder funktioniert, weil die Primitiven rendern können.)
Hier ist mein vereinfachter Fragment-Shader:
%Vor%Und .... hier ist, wo ich versuche alles zusammen zu setzen, haha:
%Vor%Funktioniert nicht richtig.
Jede Hilfe wäre extrem geschätzt, ich habe keine Ideen und bin hier ratlos. Vielen Dank im Voraus!
** Bearbeiten: Hier ist mein Code, den ich verwende, um die Ansicht einzurichten, OpenGL zu laden und die Capture-Sitzung zu starten.
%Vor%Diese Beispielanwendung von mir hat drei Shader, die verschiedene Ebenen der Verarbeitung und Anzeige von Kamerabilder auf den Bildschirm. Ich erkläre, wie diese Anwendung in meinem Beitrag hier funktioniert sowie in der OpenGL ES 2.0-Sitzung meiner Klasse auf iTunes U .
Tatsächlich scheinen die Shader hier direkte Kopien von denen zu sein, die ich für die direkte Anzeige von Videobildern verwendet habe, so dass Sie diese Anwendung wahrscheinlich bereits als Vorlage verwenden. Ich nehme an, dass meine Beispielanwendung auf Ihrem Gerät einwandfrei funktioniert?
Wenn ja, dann muss es einen Unterschied zwischen der Startprobe und Ihrer Bewerbung geben. Sie scheinen mein Beispiel vereinfacht zu haben, indem Sie einen Teil des Codes, den ich in der -drawFrame
-Methode hatte, in das Ende Ihrer Delegate-Methode ziehen, was gut funktionieren sollte. Das ist also nicht das Problem. Ich nehme an, dass der Rest Ihrer OpenGL-Konfiguration identisch ist mit dem, was ich in diesem Beispiel hatte, also ist die Szene richtig konfiguriert.
Wenn Sie meinen Code durchsehen und ihn mit dem vergleichen, was Sie gepostet haben, sehe ich nur einen fehlenden glUseProgram()
-Aufruf in Ihrem Code. Wenn Sie das Shader-Programm korrekt kompiliert und mit dem Code, den Sie hier gezeigt haben, verknüpft haben, müssen Sie glUseProgram()
irgendwo verwenden, bevor Sie die einheitlichen Werte aktualisieren.
Außerdem bindest du den Render-Puffer, aber du brauchst vielleicht
%Vor% nach der letzten Zeile dort, um sicherzustellen, dass der Inhalt auf den Bildschirm gelangt (wobei context
Ihre EAGLContext-Instanz ist).
Könnte das ein Threading-Problem sein? Der captureOutput-Delegat kann in einem anderen Thread als initWithFrame aufgerufen werden. Wenn Sie die Anzeige mit UIKit aktualisieren möchten, müssen Sie sicherstellen, dass dies im Hauptthread geschieht, z. B. in Ihrer Funktion captureOutput würden Sie Folgendes tun:
%Vor%Und dann fügen Sie den UI-Aktualisierungscode in die Funktion processFrame ein. Ich weiß, dass Sie nicht UIKit für Ihre Anzeige verwenden, aber Sie können auch keinen OpenGL-Kontext zwischen Threads teilen, so dass dies vielleicht immer noch für Ihren Fall gilt. Nur ein Gedanke sowieso.
Ist Ihr Bildpuffer klobig oder planar? Ich gehe gerade durch und habe nicht jedes letzte Stück von Apple's Dokumentation hier gelesen, aber ich habe gelesen, dass diese Frage bestimmt, was Sie an der Basisadresse des Puffers finden.