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

青橙相机

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容