我正在使用SurfaceTexture进行实时相机预览。这会将数据流作为纹理直接发送到GPU。
每个新相机框架都会覆盖此纹理。
现在 - 我想避免这种覆盖,并在内存中保留最后几个(n)前一帧(这是我的最终目标)
来自相机的数据总是会覆盖n个可用纹理中最古老的纹理。我只需要在它们之间交替。
当数据进入时,这些纹理需要立即呈现。
我不需要:将捕获的数据保存为字节缓冲区并将其转换回新纹理=慢速,所有都必须是实时的。性能是关键所在。
我使用此程序示例以surfaceTexture模式运行相机:http://maninara.blogspot.co.uk/2012/09/render-camera-preview-using-opengl-es.html
我试图使用SurfaceTexture类的attachToGLContext(int texName)方法附加一个新纹理,但它似乎不允许我这样做而不破坏前一个,似乎我必须在附加之前使用“detachFromGLContext()”一个新的..
http://developer.android.com/reference/android/graphics/SurfaceTexture.html
任何帮助表示感谢。
答案 0 :(得分:0)
如何将数据流发送到纹理?
就我而言,我在onSurfaceCreated
中创建了多个纹理。然后在onDraw
中覆盖它们。整个过程是实时的,不需要帧缓冲来存储数据。
在onDraw
中,我使用glActiveTexture
和glBindTexture
来选择要覆盖的纹理。
这是代码,希望它有所帮助。
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + texture_index);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, m_texture[texture_index]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, m_frame.width, m_frame.height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, camera_data);