影视处理

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

2020-03-26  本文已影响0人  古风子
青橙相机

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

1 着色器的区别

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

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

#extension GL_OES_EGL_image_external : require

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

加载程序差异

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

        uTextureMatrixLocation = glGetUniformLocation(glProgId, "uTextureMatrix");

//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);
        }  
      ....
}
   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);
    }

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

上一篇下一篇

猜你喜欢

热点阅读