小编Jak*_*ade的帖子

glReadPixels 很慢

我正在使用 GLSurfaceView 创建自定义相机预览,使用 OpenGl 渲染相机提供给我的帧。我已经完全实现了相机,并按照我期望的方式工作,没有 fps 损失和正确的纵横比等。但是当我需要捕获来自相机源的帧时,问题出现了,我的第一个想法是使用 glReadPixles ()

使用 GLES20.glReadPixels() 我发现某些设备会出现 fps 损失,主要是屏幕分辨率较高的设备,这是有道理的,因为 glReadPixels 需要以更高分辨率读取更多像素。

我做了一些挖掘,发现其他人对 glReadPixels 也有类似的问题,许多人建议使用 PBO,最好使用其中两个作为双缓冲区,这将允许我读取像素数据,而不会阻塞/停止当前的渲染过程。我完全理解双缓冲的概念,我对 OpenGL 相当陌生,需要一些关于如何让双缓冲 PBO 工作的指导。

我找到了一些 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); …
Run Code Online (Sandbox Code Playgroud)

android opengl-es-2.0 android-camera2

6
推荐指数
1
解决办法
1931
查看次数

标签 统计

android ×1

android-camera2 ×1

opengl-es-2.0 ×1