5

Ich versuche, die Kameravorschau an ein Oberflächentexture-Objekt zu senden und es auf einem Quadrat zu rendern. Ich habe laufenden Code für GLES20 aber fand nichts für 1.x. Grundsätzlich sollte es so funktionieren, oder?Android OpenGLES 1.x CameraPreview zu Surfacetexture

// setup texture 
gl.glActiveTexture(GL10.GL_TEXTURE0); 
gl.glGenTextures(1, textures, 0); 
gl.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]); 
gl.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, ...); 
... 

// setup surfacetexture object 
surface = new SurfaceTexture(textures[0]); 
surface.setOnFrameAvailableListener(this); 


// setup camera 
mCamera = Camera.open(0); 
Camera.Parameters param = mCamera.getParameters(); 
List<Size> psize = param.getSupportedPreviewSizes(); 
//find previewsize to match glsurface from renderer 
param.setPreviewSize(psize.get(i).width, psize.get(i).height); 
mCamera.setParameters(param); 

// set the texture and start preview 
mCamera.setPreviewTexture(surface); 
mCamera.startPreview(); 


// in the "onFrameAvailable" handler, i switch a flag to mark a new frame 
updateSurface = true; 


// and in the renderloop i update and redraw 
if (updateSurface) { 
    surface.updateTexImage(); 
    updateSurface = false; 
} 
gl.glActiveTexture(GL10.GL_TEXTURE0); 
gl.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]); 

// Draw square 
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBufferFloor); 
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 

Das Quadrat wird gezeichnet, ist aber komplett weiß. Ich erhalte keine Fehlermeldungen oder andere Ausnahmen. Der "onFrameAvailable" -Handler wird ebenfalls aufgerufen. Wenn ich glTeximage mit einer geladenen Bitmap verwende, wird es korrekt auf dem Quadrat gezeichnet.

ANY Ideen? Vielen Dank!

Antwort

7

Ich bin mit dem gleichen Problem konfrontiert. Vielleicht liege ich falsch, aber es scheint, dass SurfaceTexture nicht mit GLES10 kompatibel ist. Die Oberflächentextur verwendet GL_TEXTURE_EXTERNAL_OES und damit einen benutzerdefinierten Fragment-Shader, der diese Textur verwenden kann ("#extension GL_OES_EGL_image_external: require").

Da glUseProgram (...) usw. in GLES10 nicht verfügbar ist, können wir keine benutzerdefinierten Shader verwenden.

Wie gesagt, vielleicht bin ich falsch ... Viel Glück

EDIT: Ich habe es endlich an die Arbeit. Sie sollten "gl.glEnable (GLES11Ext.GL_TEXTURE_EXTERNAL_OES)" verwenden;

+0

Alter, Ihre Bearbeitung war, was es nach 4 Stunden der Suche nach der Antwort funktioniert. Vielen Dank. – Mikle

+0

Danke. Lies es einfach, kann es im Moment nicht bestätigen. Da Sie beide zustimmen, dass es funktioniert, flagge ich es. –