《OpenGL 之 EGL 使用实践.docx》由会员分享,可在线阅读,更多相关《OpenGL 之 EGL 使用实践.docx(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、OpenGL之EGL使用实践OpenGL是跨平台的、专业的图形编程接口而接口的实现是由厂商来完成的。而当我们使用这组接口完成绘制之后要把结果显示在屏幕上就要用到EGL来完成这个转换工作。EGL是OpenGLES渲染API以及本地窗口系统nativeplatformwindowsystem之间的一个中间接口层它也主要由厂商来实现。EGL提供了如下机制与设备的原生窗口系统通信查询绘图外表的可用类型以及配置创立绘图外表在OpenGLES以及其他图形渲染API之间同步渲染管理纹理贴图等渲染资源为了让OpenGLES可以绘制在当前设备上我们需要EGL作为OpenGLES与设备的桥梁。我们可以直接用GLS
2、urfaceView来进展OpenGL的渲染就是因为在GLSurfaceView的内部已经完成了对EGL的使用封装当然我们可以以封装自己的EGL环境。EGL使用理论EGL的使用要遵循一些固定的步骤按照这些步骤去配置、创立、渲染、释放。创立与本地窗口系统的连接调用eglGetDisplay方法得到EGLDisplay初始化EGL方法调用eglInitialize方法初始化确定渲染外表的配置信息调用eglChooseConfig方法得到EGLConfig创立渲染上下文通过EGLDisplay以及EGLConfig调用eglCreateContext方法创立渲染上下文得到EGLContext创立渲染
3、外表通过EGLDisplay以及EGLConfig调用eglCreateWindowSurface方法创立渲染外表得到EGLSurface绑定上下文通过eglMakeCurrent方法将EGLSurface、EGLContext、EGLDisplay三者绑定接下来就可以使用OpenGL进展绘制了。交换缓冲当用OpenGL绘制完毕后使用eglSwapBuffers方法交换前后缓冲将绘制内容显示到屏幕上释放EGL环境绘制完毕不再需要使用EGL时取消eglMakeCurrent的绑定销毁EGLDisplay、EGLSurface、EGLContext。假如对EGLDisplay、EGLSurface
4、、EGLContext这些抽象概念傻傻分不清楚可以参考这幅图其中Display(EGLDisplay)是对实际显示设备的抽象SurfaceEGLSurface是对用来存储图像的内存区域FrameBuffer的抽象包括ColorBufferStencilBufferDepthBufferContext(EGLContext)存储OpenGLES绘图的一些状态信息使用EGL的详细步骤如下创立与本地窗口系统的连接通过eglGetDisplay方法创立与本地窗口系统的连接返回的是EGLDisplay类型对象可以把它抽象理解成设备的显示屏幕。1privateEGLDisplaymEGLDisplayEG
5、L14.EGL_NO_DISPLAY;2/创立与本地窗口系统的连接3mEGLDisplayEGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);4/假如创立之后还是EGL_NO_DISPLAY表示创立失败5if(mEGLDisplayEGL14.EGL_NO_DISPLAY)6/failed7这一步就可以看成是选择显示设备一般都是选择默认的显示设备也就是手机屏幕。初始化EGL创立EGLDisplay对象之后要将它进展初始化。1/EGL的主版本号2privateintmMajorVersionnewint1;3/EGL的次版本号4privateintmMi
6、norVersionnewint1;5booleanresultEGL14.eglInitialize(mEGLDisplay,mMajorVersion,0,mMajorVersion,0);6if(!result)7/failed8初始化的时候可以获得EGL的主版本号与次版本号。确定可用的渲染外表Surface配置把Surface看成是一个渲染外表渲染外表包含一些配置信息也就是EGLConfig属性比方EGL_RED_SIZE颜色缓冲区中红色用几位来表示EGL_BLUE_SIZE颜色缓冲区中蓝色用几位来表示更多的EGLConfig属性参考这里s:/jianshu/p/9db986365cd
7、a。有两种方式用来确定可用的渲染外表配置。通过eglGetConfigs的方法获取底层窗口系统支持的所有EGL渲染外表配置再用eglGetConfigAttrib查询每个EGLConfig的信息。1publicstaticnativebooleaneglGetConfigs(2EGLDisplaydpy,3EGLConfigconfigs,4intconfigsOffset,5intconfig_size,6intnum_config,7intnum_configOffset8);910publicstaticnativebooleaneglGetConfigAttrib(11EGLDispl
8、aydpy,12EGLConfigconfig,13intattribute,14intvalue,15intoffset16);另一种是创立好渲染外表配置列表通过eglChooseConfig的方法找到符合要求的EGLConfig配置。1publicstaticnativebooleaneglChooseConfig(2EGLDisplaydpy,3intattrib_list,4intattrib_listOffset,5EGLConfigconfigs,6intconfigsOffset,7intconfig_size,8intnum_config,9intnum_configOffse
9、t10);第二种方法相对于第一种来讲不用再查询每一个EGLConfig属性了。详细使用如下1/定义EGLConfig属性配置2privatestaticfinalintEGL_CONFIG3EGL14.EGL_RED_SIZE,CFG_RED_SIZE,4EGL14.EGL_GREEN_SIZE,CFG_GREEN_SIZE,5EGL14.EGL_BLUE_SIZE,CFG_BLUE_SIZE,6EGL14.EGL_ALPHA_SIZE,CFG_ALPHA_SIZE,7EGL14.EGL_DEPTH_SIZE,CFG_DEPTH_SIZE,8EGL14.EGL_STENCIL_SIZE,CFG
10、_STENCIL_SIZE,9EGL14.EGL_RENDERABLE_TYPE,EGL14.EGL_OPENGL_ES2_BIT,10EGL14.EGL_NONE,11;首先定义EGLConfig属性配置数组定义红、绿、蓝、透明度、深度、模板缓冲的位数最后要以EGL14.EGL_NONE结尾。1/所有符合配置的EGLConfig个数2intnumConfigsnewint1;3/所有符合配置的EGLConfig4EGLConfigconfigsnewEGLConfig1;56/configs参数为null,会在numConfigs中输出所有知足EGL_CONFIG条件的config个数7EG
11、L14.eglChooseConfig(mEGLDisplay,EGL_CONFIG,0,null,0,0,numConfigs,0);8/得到知足条件的个数9intnumnumConfigs0;10if(num!0)11/会获取所有知足EGL_CONFIG的config12EGL14.eglChooseConfig(mEGLDisplay,EGL_CONFIG,0,configs,0,configs.length,numConfigs,0);13/去第一个14mEGLConfigconfigs0;15首先通过给eglChooseConfig相应参数设置为null找到符合条件的EGLConfi
12、g个数假如不为空那么再一次调用取第一个就是想要的EGLConfig配置。创立渲染上下文有了EGLDisplay以及EGLConfig对象就可以创立渲染外表EGLSurface以及渲染上下文EGLContext。在创立渲染上下文时同样要创立属性信息主要是指定OpenGL使用版本。1privatestaticfinalintEGL_ATTRIBUTE2EGL14.EGL_CONTEXT_CLIENT_VERSION,2,3EGL14.EGL_NONE,4;同样还是以EGL14.EGL_NONE结尾。1privateEGLContextmEGLContextEGL14.EGL_NO_CONTEXT;
13、2/创立上下文3mEGLContextEGL14.eglCreateContext(mEGLDisplay,mEGLConfig,EGL14.EGL_NO_CONTEXT,EGL_ATTRIBUTE,0);4if(mEGLContextEGL14.EGL_NO_CONTEXT)5/failed6创立渲染外表EGL提供了两种方式创立渲染外表一种是可见的渲染到屏幕上一种是不可见的也就离屏的。eglCreatePbufferSurface创立离屏的渲染外表eglCreateWindowSurface创立渲染到屏幕的渲染外表无论使用哪种创立方式也都需要创立配置信息。1/创立渲染外表的配置信息2priv
14、atestaticfinalintEGL_SURFACE3EGL14.EGL_NONE,4;5privateEGLSurfacemEGLSurfaceEGL14.EGL_NO_SURFACE;6/surface参数是有SurfaceView.getHolder传递过来的7mEGLSurfaceEGL14.eglCreateWindowSurface(mEGLDisplay,mEGLConfig,surface,EGL_SURFACE,0);对于渲染到屏幕上的创立配置信息可以不添加什么但还是要以EGL14.EGL_NONE结尾。而对于离屏的渲染外表创立就还需要提供宽、高等信息但是却不需要提供su
15、rface的参数了。1/使用eglCreatePbufferSurface就需要指定宽以及高2intEGL_SURFACE3EGL10.EGL_WIDTH,w,4EGL10.EGL_HEIGHT,h,5EGL10.EGL_NONE,6;7mEGLSurfacemEGL.eglCreatePbufferSurface(mEGLDisplay,mEGLConfig,EGL_SURFACE,0);绑定上下文当有了EGLDisplay、EGLSurface、EGLContext对象之后就可以为EGLContext绑定上下文了。1EGL14.eglMakeCurrent(mEGLDisplay,mEGL
16、Surface,mEGLSurface,mEGLContext);当绑定上下文之后就可以执行详细的绘制操作了调用OpenGL相关的方法绘制图形。交换缓冲进展显示当绘制完毕之后就该把绘制结果显示在屏幕上了。1EGL14.eglSwapBuffers(mEGLDisplay,mEGLSurface);通过eglSwapBuffers方法将后台绘制的缓冲显示到前台。释放操作当绘制完毕时要进展相应的释放操作。1EGL14.eglMakeCurrent(mEGLDisplay,EGL14.EGL_NO_SURFACE,EGL14.EGL_NO_SURFACE,EGL14.EGL_NO_CONTEXT);
17、2EGL14.eglDestroyContext(mEGLDisplay,mEGLContext);3EGL14.eglDestroySurface(mEGLDisplay,mEGLSurface);4EGL14.eglReleaseThread();5EGL14.eglTerminate(mEGLDisplay);67mEGLContextEGL14.EGL_NO_CONTEXT;8mEGLDisplayEGL14.EGL_NO_DISPLAY;9mEGLConfignull;相当于就是把前面操作的EGL相关对象都释放掉。当完成这样的一个流程之后就根本上掌握了EGL的大局部使用。EGL操作的很多流程都是固定的可以把它们再单独做一层封装这里可以参考grafika的封装。文章中详细代码局部可以参考我的Github工程欢送Star。s:/github/glumes/AndroidOpenGLTutorial技术沟通欢送加我微信ezglumes拉你入技术沟通群。私信领取相关资料推荐浏览音视频开发工作经历共享|视频版觉得不错点个在看呗
限制150内