Ich habe ein Problem mit der Umwandlung der Kameravorschau in Android vom YUV-Format in RGB. Der Zweck der Konvertierung besteht darin, einige Effekte anzuwenden. Ich versuche, durch Fragment-Shader zu konvertieren, weil die Konvertierung durch systemeigenen Code langsam ist (ca. 14fps). Die Referenz, die ich verwendet habe, ist Ссылка . Ich versuche, diesen Code auf Android-Plattform zu portieren, aber das Ergebnis sind schwarz-grüne Rechtecke. Aber ich kann etwas Form durch die Ausgabe sehen, die ich bekomme. Könnten Sie mir bitte helfen, dieses Problem zu lösen? Ich glaube, das ist ein beliebtes Problem: Effekte auf die Kameravorschau anwenden. Ich gebe auch einen Link zu meinem Projekt zum Testen: Ссылка .
Vielen Dank.
AKTUALISIERT:
Dies ist meine Methode onPreviewFrame :
So binde ich Byte-Arrays an die OpenGL-Textur in onDrawFrame -Methode:
%Vor%Und das ist mein Fragment-Shader-Code:
%Vor%Ich bin mir nicht sicher, ob Sie das Problem bereits behoben haben. Meine Antwort
setPreviewFormat(ImageFormat.YV12);
, oder benutze einen anderen Shader Es gibt 3 Texturen, stellen Sie sicher, dass Sie
tun GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, muTextureName)
vor dem Aufruf eines beliebigen glTexImage2D. und glTexSubImage2D
Sie können glTexSubImage2D auch einmal mit jedem frame und glTexImage2D verwenden.
Größe von U und V ist gleich, zumindest für YV12,
System.arraycopy(data, U_INDEX, uData, 0, LENGTH_4 * 2);
sollte sein %Code% Ändern Sie die Größe entsprechend im Code.
Ich weiß nicht, ob Sie Ihr Problem gelöst haben.
Ich habe deinen Code benutzt und in diesem Modus gelöst.
%Vor%}
Schließlich hat Ihr Projekt eine Kameravorschau angezeigt. Ich habe 2 Probleme gefunden: 1. Vor dem Binden und Ändern der Oberflächeneigenschaften müssen Sie GLES20.glActiveTexture (GLES20.surfacenummer) aufrufen; 2. Wichtigeres und verstecktes Problem ist das GLES20.glTexImage2D () funktioniert nicht mit Breite und Höhe, die keine Potenz von 2 Zahlen sind. Nachdem Sie die Textur mit der Größe 1024X1024 geladen haben, sollten Sie GLES20.glTexSubImage2D ()
aufrufenViel Glück!
Verwenden Sie für die schnellste und optimalste Methode die allgemeine GL-Erweiterung
%Vor%Als in Java
%Vor%In Java GL Thread
%Vor%Die Farbkonvertierung ist bereits für Sie erledigt. Sie können tun, was immer Sie möchten, direkt im Fragment-Shader.
Hoffe, dass Sie in Ihrer Recherche etwas Zeit sparen.
Ich habe die Lösungsform Wie man das Android-YUV-NV21-Kamerabild auf dem Hintergrund in libgdx mit OpenGLES 2.0 in Echtzeit rendert? zu dem in der Frage geteilten Projekt und bekam ein funktionierendes Projekt. Wenn Sie wie ich nach Tutorial-Code suchen, der YUV-RGB-Konvertierung durch Fragment-Shader durchführt, können Sie einfach die folgenden Schritte ausführen, um ein funktionierendes Beispiel zu erhalten.
Die wichtigsten Punkte des Codes in der Frage sind:
Nun der korrigierte Code: Ersetzen Sie bitte GLRenderer.java durch
%Vor%und ersetzen Sie f_convert.glsl durch
%Vor%Tags und Links android camera opengl-es shader fragment-shader