我正在使用GLSurfaceView创建自定义相机预览,使用OpenGL来渲染相机给我的帧。我已经完全实现了相机,并按照预期工作,没有fps损失和正确的纵横比等。但当我需要捕获来自相机的帧时,问题就出现了。我的第一个想法是使用glReadPixles()。
使用GLES20.glReadPixels(),我发现一些设备会出现fps损失,尤其是具有更高屏幕分辨率的设备,这很合理,因为glReadPixels需要读取更多像素。
我进行了一些调查,发现其他人也遇到了glReadPixels的类似问题,许多人建议使用PBO,使用两个PBO充当双缓冲区,这将使我能够在不阻塞/停止当前渲染过程的情况下读取像素数据。我完全理解双缓冲的概念,但我对如何使双缓冲PBO正常工作需要一些指导,因为我还是OpenGL的新手。
我找到了一些关于PBO双缓冲的解决方案,但我从未找到一个完整的解决方案来充分理解它如何与GLES交互。
我的GLSurfaceView.Renderer.onDrawFrame()的实现。
使用GLES20.glReadPixels(),我发现一些设备会出现fps损失,尤其是具有更高屏幕分辨率的设备,这很合理,因为glReadPixels需要读取更多像素。
我进行了一些调查,发现其他人也遇到了glReadPixels的类似问题,许多人建议使用PBO,使用两个PBO充当双缓冲区,这将使我能够在不阻塞/停止当前渲染过程的情况下读取像素数据。我完全理解双缓冲的概念,但我对如何使双缓冲PBO正常工作需要一些指导,因为我还是OpenGL的新手。
我找到了一些关于PBO双缓冲的解决方案,但我从未找到一个完整的解决方案来充分理解它如何与GLES交互。
我的GLSurfaceView.Renderer.onDrawFrame()的实现。
// mBuffer and mBitmap are declared and allocated outside of the onDrawFrame Method
// Buffer is used to store pixel data from glReadPixels
mBuffer.rewind();
GLES20.glUseProgram(hProgram);
if (tex_matrix != null)
{
GLES20.glUniformMatrix4fv(muTexMatrixLoc, 1, false, tex_matrix, 0);
}
GLES20.glUniformMatrix4fv(muMVPMatrixLoc, 1, false, mMvpMatrix, 0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, tex_id);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, GLConstants.VERTEX_NUM);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
// Read pixels from the current GLES context
GLES10.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mBuffer);
// Copy the Pixels from the buffer
mBitmap.copyPixelsFromBuffer(mBuffer);
GLES20.glUseProgram(0);