美文网首页影视处理
Camera2 教程 5:两种预览方式比较

Camera2 教程 5:两种预览方式比较

作者: 古风子 | 来源:发表于2020-03-26 10:46 被阅读0次
    青橙相机

    由以上两节的相机预览实现方式,可以知道:两种方式的流程大同小异,主要区别如下:

    1 着色器的区别

    着色器的差别
    1. OES顶点着色器中,会有一个纹理变换矩阵,这个矩阵是SurfaceTuxture调用updateTexImage更新的纹理矩阵

    2. OES片元作色器中,纹理类型声明的是samplerExternalOES而不是sampler2D,并且需要显式的声明:

    #extension GL_OES_EGL_image_external : require
    

    否则,loader着色器程序的时候会报错

    加载程序差异

    作色器有差异,那对应的java的程序代码也是有差异的

    • 首先,初始化的时候需要获取纹理变换矩阵的引用
            uTextureMatrixLocation = glGetUniformLocation(glProgId, "uTextureMatrix");
    
    
    • 然后,在onDraw绘制的时候,将该变换矩阵传递到着色器中
    //onDraw
                glUniformMatrix4fv(uTextureMatrixLocation, 1, false, transformMatrix, 0);
    
    

    transformMatrix是矩阵数据,从SurfaceTexture中获取

      @Override
        public void onDrawFrame(GL10 gl) {
    
            if (mSurfaceTexture != null) {
               //mSurfaceTexture必须在Render线程中更新
                mSurfaceTexture.updateTexImage();
                mSurfaceTexture.getTransformMatrix(transformMatrix);
            }  
          ....
    }
    
    • 最后,在onDraw绘制的时候,绑定的纹理id不同
       public void onDraw(float[] transformMatrix, int textureId, FloatBuffer cubeBuffer, FloatBuffer textureBuffer) {
            ...
    
            if (textureId != OpenGlUtils.NO_TEXTURE) {
                 ...
                glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
                 ...
                glUniformMatrix4fv(uTextureMatrixLocation, 1, false, transformMatrix, 0);
            }
    
              ....
            GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
              ....
            glBindFramebuffer(GL_FRAMEBUFFER, 0);
        }
    

    以上即是,两种预览方式的区别,其他流程都是一样的

    相关文章

      网友评论

        本文标题:Camera2 教程 5:两种预览方式比较

        本文链接:https://www.haomeiwen.com/subject/dppquhtx.html