下面这个结构图太给力了.分成surfaceTexture和Opengl 两个部分
GLES shareContext输出两个方向codec和surfaceView
shareContext 和离屏渲染的整理结构图
多线程shareContext实现
细化上面的渲染线程Render-GL thread,添加滤镜(增加了3个filter. filter的实现有两种方式,普通渲染和离屏渲染,本文采用离屏渲染.filter渲染实现采用GPUimage.java)
离屏绘制
基础知识
要想使用OpenGL ES,一般包括如下几个步骤:
(1)EGL初始化
(2)OpenGL ES初始化
(3)OpenGL ES设置选项&绘制
(4)OpenGL ES资源释放(可选)
(5)EGL资源释放
EGL 初始化:
eglGetDisplay(EGL_DEFAULT_DISPLAY)
eglInitialize(eglDisp, &eglMajVers, &eglMinVers)
eglChooseConfig(eglDisp, confAttr, &eglConf, 1, &numConfigs)
eglCreatePbufferSurface(eglDisp, eglConf, surfaceAttr)
eglCreateContext(eglDisp, eglConf, EGL_NO_CONTEXT, ctxAttr)
eglMakeCurrent(eglDisp, eglSurface, eglSurface, eglCtx)
Opengl 处理
glViewport(0,0,512,512);
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1,&vertex_shader,NULL);
glCompileShader(vertexShader);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1,&fragment_shader,NULL);
glCompileShader(fragmentShader);
GLuint program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
gllinkProgram(program);
glUseProgram(program);
GLuint aPositionLocation =glGetAttribLocation(program, "a_Position");
glVertexAttribPointer(aPositionLocation,2,GL_FLOAT,GL_FALSE,0,tableVerticesWithTriangles);
glEnableVertexAttribArray(aPositionLocation);
//draw something
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES,0,6);
eglSwapBuffers(eglDisp,eglSurface);



