1、EGL环境搭建1。1关键方法介绍 1)eglGetDisplay获取EGL显示窗口 2)eglInitialize对(1)中获取到的Display进行初始化 3)eglChooseConfig根据对窗口的条件要求从系统中选择最佳的配置数据 4)eglCreateContext结合EGLDisplay与EGLConfig创建EGL上下文 5)eglCreateWindowSurface通过Android提供的Surface创建画布 6)eglMakeCurrentEGLContext、EGLSurface、EGLDisplay创建EGL环境,到这一步我们就可以在当前线程下执行OpenGL相关的Api了 7)eglSwapBufferSurface内容上屏(每一次OpenGL操作后,都需要执行此操作,确保OpenGL绘制操作及时生效)2、OpenGL着色器2。1关键方法介绍 加载着色器 1)eglCreateShader根据指定类型(GLFRAGMENTSHADER、GLVERTEXSHADER。。。)创建一个空的OpenGLShader 2)glShaderSource给创建出来的Shader输入GLSL代码 3)glCompileShader编译shader 4)glGetShaderiv获取编译过程中的状态信息GLCOMPILESTATUS获取编译状态,0表示编译失败GLINFOLOGLENGTH获取编译中的日志字符长度 5)glGetShaderInfoLog根据(4)中的日志长度得到编译中的日志信息 6)glDeleteShader清除Shader 创建着色器程序 7)glCreateProgram创建一个空的着色器程序 8)glAttachShader为着色器程序添加Shader 9)glLinkProgram对(8)中的Shader进行链接 10)glGetProgramiv获取链接过程中的状态信息GLLINKSTATUS获取链接状态码,0表示链接失败GLINFOLOGLENGTH获取链接过程中的日志字符长度 11)glGetProgramInfoLog根据(10)中的日志长度得到链接过程中的日志信息 12)glDeleteProgram清理着色器程序2。2YUV着色器 顶点着色器attributevec4vPattributevec2fPvaryingvec2vTextCuniformmat4vMvoidmain(){vTextCoordfPglPositionvPositionvM} 片段着色器varyingvec2vTextCuniformsampler2DyTuniformsampler2DuTuniformsampler2DvTvoidmain(){floatytexture2D(yTexture,vTextCoord)。r;floatutexture2D(uTexture,vTextCoord)。r0。5;floatvtexture2D(vTexture,vTextCoord)。r0。5;vec3rgb。ry1。403v;rgb。gy0。344u0。714v;rgb。by1。770u;glFragColorvec4(rgb,1。0);}3、Demo实现3。1流程简介 C音视频学习资料免费获取方法:关注音视频开发T哥,点击链接即可免费获取2023年最新C音视频开发进阶独家免费学习大礼包! 3。2代码实现 CMake库引入targetlinklibraries({PROJECTNAME}logcat{androidlog}opengllibeglEGLopensllibOpenSLESopengles2。0GLESv2androidbasiclibANativeWindowandroid) 1)创建EGL环境,使得当前线程支持OpenGL操作1、获取默认窗口EGLDisplayeglDisplayeglGetDisplay(EGLDEFAULTDISPLAY);2、对窗口进行初始化EGLintmajor,eglInitialize(eglDisplay,major,minor);3、为窗口从系统中选定合适的配置EGLintconfigAttrib〔〕{EGLREDSIZE,8,EGLGREENSIZE,8,EGLBLUESIZE,8,EGLALPHASIZE,8,EGLDEPTHSIZE,8,EGLSTENCILSIZE,8,EGLRENDERABLETYPE,EGLOPENGLES2BIT,OpenGLES2。0EGLNONE};EGLEGLConfigeglCeglChooseConfig(eglDisplay,configAttrib,eglConfig,1,num);4、创建EGL上下文EGLintcontextAttrib〔〕{EGLCONTEXTCLIENTVERSION,2,OpenGLES2。0EGLNONE};EGLContexteglContexteglCreateContext(eglDisplay,eglConfig,EGLNOCONTEXT,contextAttrib);5、创建窗口画布EGLintsurfaceAttrib〔〕{EGLWIDTH,1,EGLHEIGHT,1,EGLNONE};这是一个离屏的Surface,等Android可视Surface到达后可进行更换EGLSurfaceeglPbSurfaceeglCreatePbufferSurface(eglDisplay,eglConfig,surfaceAttrib);6、为当前线程绑定EGL环境eglMakeCurrent(eglDisplay,eglPbSurface,eglPbSurface,eglContext); 2)将EGL环境中的离屏Surface更新为可视Surface(TextureVieworSurfaceViewor。。。)includevoidVideoViewYUV::OnSurfaceCreated(JNIEnvenv,jobjectsurface){将surface转为ANativeWindow类型ANativeWindowwindowANativeWindowfromSurface(env,surface));通过ANativeWindow创建EGLSurfaceEGLSurfacesurfaceeglCreateWindowSurface(egldisplay,eglconfig,window,0);将此Surface更新为当前EGL环境的输出对象eglMakeCurrent(eglDisplay,surface,surface,eglContext);} 3)编译OpenGL着色器1、编译vertex着色器GLuintvertexShaderglCreateShader(GLVERTEXSHADER);glShaderSource(vertexShader,1,vertexShaderCode,NULL);glCompileShader(vertexShader);2、编译fragment着色器GLuintfragmentShaderglCreateShader(GLFRAGMENTSHADER);glShaderSource(fragmentShader,1,fragmentShaderCode,NULL);glCompileShader(fragmentShader);3、创建着色器程序GLuintprogramglCreateProgram();3。1为着色器程序链接shaderglAttachShader(program,vertexShader);glAttachShader(program,fragmentShader);3。2链接程序glLinkProgram(program); 4)启用着色器并初始化相关变量1、启用着色器程序glUseProgram(program);2、找到着色器程序中的所有变量gpuYTextureglGetUniformLocation(glslProgram,yTexture);gpuUTextureglGetUniformLocation(glslProgram,uTexture);gpuVTextureglGetUniformLocation(glslProgram,vTexture);gpuVMatrixglGetUniformLocation(glslProgram,vMatrix);gpuVPositionglGetAttribLocation(glslProgram,vPosition);gpuFPositionglGetAttribLocation(glslProgram,fPosition);glGenTextures(3,cpuYuvTexture);for(inti0;i3;i){glBindTexture(GLTEXTURE2D,cpuYuvTexture〔i〕);glTexParameteri(GLTEXTURE2D,GLTEXTUREWRAPS,GLREPEAT);glTexParameteri(GLTEXTURE2D,GLTEXTUREWRAPT,GLREPEAT);glTexParameteri(GLTEXTURE2D,GLTEXTUREMAGFILTER,GLLINEAR);glTexParameteri(GLTEXTURE2D,GLTEXTUREMINFILTER,GLLINEAR);glBindTexture(GLTEXTURE2D,0);}3、输入坐标数据、变换矩阵数据floatvposition〔8〕{1。f,1。f,1。f,1。f,1。f,1。f,1。f,1。f};floatfposition〔8〕{0。f,0。f,1。f,0。f,0。f,1。f,1。f,1。f};glEnableVertexAttribArray(gpuVPosition);glVertexAttribPointer(gpuVPosition,2,GLFLOAT,GLFALSE,sizeof(GLFLOAT)2,vposition);glEnableVertexAttribArray(gpuFPosition);glVertexAttribPointer(gpuFPosition,2,GLFLOAT,GLFALSE,sizeof(GLFLOAT)2,fposition);glUniformMatrix4fv(gpuVMatrix,1,GLFALSE,matrix); 5)输入YUV图片数据并绘制顶点上屏glActiveTexture(GLTEXTURE0);glBindTexture(GLTEXTURE2D,cpuYuvTexture〔0〕);glUniform1i(gpuYTexture,0);glTexImage2D(GLTEXTURE2D,0,GLLUMINANCE,imageWidth,imageHeight,0,GLLUMINANCE,GLUNSIGNEDBYTE,y);glActiveTexture(GLTEXTURE1);glBindTexture(GLTEXTURE2D,cpuYuvTexture〔1〕);glUniform1i(gpuUTexture,1);glTexImage2D(GLTEXTURE2D,0,GLLUMINANCE,imageWidth2,imageHeight2,0,GLLUMINANCE,GLUNSIGNEDBYTE,u);glActiveTexture(GLTEXTURE2);glBindTexture(GLTEXTURE2D,cpuYuvTexture〔2〕);glUniform1i(gpuVTexture,2);glTexImage2D(GLTEXTURE2D,0,GLLUMINANCE,imageWidth2,imageHeight2,0,GLLUMINANCE,GLUNSIGNEDBYTE,v);glDrawArrays(GLTRIANGLESTRIP,0,4);内容上屏eglSwapBuffer(); 原文链接:AndroidOpenGLES娓叉煋YUV鎺橀噾