由以上两节的相机预览实现方式,可以知道:两种方式的流程大同小异,主要区别如下:
1 着色器的区别
着色器的差别-
OES顶点着色器中,会有一个纹理变换矩阵,这个矩阵是SurfaceTuxture调用updateTexImage更新的纹理矩阵
-
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);
}
以上即是,两种预览方式的区别,其他流程都是一样的
网友评论