2014-04-23 10 views
6

Ich versuche, Pixel/Daten aus einer OpenGL-Textur zu lesen, die an GL_TEXTURE_EXTERNAL_OES gebunden ist.Android lesen Pixel aus GL_TEXTURE_EXTERNAL_OES

Der Grund für die Bindung der Textur an dieses Ziel ist, weil, um Live-Kamera-Feed auf Android bekommen ein SurfaceTexture aus einer OpenGL Textur erstellt werden muss, die an GL_TEXTURE_EXTERNAL_OES gebunden ist.

Da Android OpenGL ES verwendet, kann ich glGetTexImage() nicht verwenden, um die Bilddaten zu lesen.

Daher binde ich das Ziel an einen FBO und lese es dann mit readPixels(). Dies ist mein Code:

GLuint framebuffer; 
    glGenFramebuffers(1, &framebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

    //Attach 2D texture to this FBO 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 
    status("glFramebufferTexture2D() returned error %d", glGetError()); 

aber ich bin immer Fehler 1282 (GL_INVALID_OPERATION) aus irgendeinem Grund.

Antwort

0

Das Texturziel GL_TEXTURE_EXTERNAL_OES befindet sich normalerweise in einem YUV-Farbraum und glReadPixels() erfordert, dass das Ziel RGB ist. Die Farbraumkonvertierung wird wahrscheinlich nicht automatisch durchgeführt. Sie können jedoch die Konvertierung in einem eigenen Fragment-Shader durchführen, der RGB in eine andere Textur rendert und dann glReadPixels() verwendet, um das zu lesen.

texture for YUV420 to RGB conversion in OpenGL ES

+0

Dies ist nicht korrekt. Bei Android erfolgt die YUV-> RGB-Konvertierung automatisch im Hintergrund. Siehe https://stackoverflow.com/questions/46244179/android-mediacode-output-format-gles-external-texture-yuv-nv12-to-gles-tex – tmm1

2

ich denke, das das Problem sein könnte:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 

Sie sollten die cameraTexture auf den Framebuffer nicht anhängen, anstatt eine neue Textur in Form des GL_TEXTURE_2D

glGenTextures(1, mTextureHandle, 0); 

glBindTexture(GL_TEXTURE_2D, mTextureHandle[0]); 

... 
erzeugen soll

cameraTexture ist die, die Sie von SurfaceTexture erhalten, und es ist die Quelle für das Rendern. Diese neue Textur ist diejenige, die Sie darstellen sollten (die später in der Rendering-Pipeline verwendet werden könnte). Dann tun Sie dies:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_2D, mTextureHandle[0], 0); 

cameraTexture an den Framebuffer des beigefügten Textur gezogen wird, ein einfaches Shader-Programm mit dem cameraTexture zu ziehen, binden, wenn das Shader-Programm im Einsatz ist:

glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 
+1

Welche Lösung bringt diese Antwort? –

+0

Ich denke, die richtige Lösung muss die 2 Antworten zusammen zu kombinieren, erstellen Sie zuerst einen neuen Framebuffer und eine neue Textur und glFramebufferTexture2D, dann können Sie Shader verwenden, um die YUV-Daten in den Framebuffer zu zeichnen und dann kann es durch glReadPixels gelesen werden. Ein bisschen kompliziert! –