是的,你可以使用SurfaceTexture。這裏有一些溫和的技巧,因爲它需要是一個外部紋理而不是正常的2D紋理。
這意味着,如果你渲染紋理與ES2你需要一些像
#extension GL_OES_EGL_image_external : require
uniform samplerExternalOES s_texture;
在片段着色器
。
示例代碼:
int[] textures = new int[1];
// generate one texture pointer and bind it as an external texture.
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);
// No mip-mapping with camera source.
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
// Clamp to edge is only option.
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
int texture_id = textures[0];
SurfaceTexture mTexture = new SurfaceTexture(texture_id);
mTexture.setOnFrameAvailableListener(this);
Camera cam = Camera.open();
cam.setPreviewTexture(mTexture);
對我來說,'setOnFrameAvailableListener()'中止實時預覽。轉載於股票4.1.2 Nexus S,所以這不是未列出的OEM的一些錯誤。相反,帶'onSurfaceTextureUpdated()'回調函數的'setSurfaceTextureListener()'可用於追蹤單個幀。 – 2014-01-03 20:52:12