public int createTexture(){
int[] mTextures = new int[1]; GLES20.glGenTextures(1, mTextures , 0);GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextures[0]); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
return mTextures[0];
}
//比如对于camera preview 的时候,在创建SurfaceTexture的时候,就要基于这个textureId 去创建,这样就可以连接到camera preview 数据流到这个纹理上。
大概的过程如下:
1)
int texture =createTexture(); surfaceTexture=new SurfaceTexture(texture);2)
mCamera2.setPreviewTexture(surfaceTexture);//设置到camera 数据流surfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() {@Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { requestRender(); }});
3)
public void onDrawFrame(GL10 gl) { if(surfaceTexture!=null){ surfaceTexture.updateTexImage(); //更新数据流到opengl 纹理上面去。 } }4)顶点着色器,片元着色去要进行如下设置
private final String mVss = "attribute vec2 a_Position;\n" + "attribute vec2 a_TexCoord;\n" + "varying vec2 v_TexCoord;\n" + "void main() {\n" + " v_TexCoord = a_TexCoord;\n" + " gl_Position = vec4(a_Position.x, a_Position.y, 0.0, 1.0);\n" + "}"; private final String mFss = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" + "uniform samplerExternalOES u_Texture;\n" + "varying vec2 v_TexCoord;\n" + "void main() {\n" + " gl_FragColor = texture2D(u_Texture,v_TexCoord);\n" + "}";