大家好,接下来将为大家介绍EGL 作用及其使用。

1、什么是EGL

EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,EGL作为OpenGL ES与显示设备的桥梁,让OpenGL ES绘制的内容能够在呈现当前设备上。它主要由系统制造商实现。

EGL具有如下作用:

a:与设备的原生窗口系统通信。

b:查询绘图表面的可用类型和配置。

c:创建绘图表面。

d:在OpenGL ES 和其他图形渲染API之间同步渲染。

e:管理纹理贴图等渲染资源。

2、EGL和OpenGL ES的关系

从上面的讲解我们基本上可以知道,EGL为OpenGL提供绘制表面。或者说EGL是OpenGl ES的渲染画布。EGL作为OpenGL ES与显示设备的桥梁,让OpenGL ES绘制的内容能够在呈现当前设备上。

3、EGL绘图的基本步骤

简单讲解下各部分的作用:

a:Display(EGLDisplay) 是对实际显示设备的抽象。

b:Surface(EGLSurface)是对用来存储图像的内存区域FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer。

c:Context (EGLContext) 存储 OpenGL ES绘图的一些状态信息。

4.1、EGL的基本使用步骤:

a:获取 EGL Display 对象:通过eglGetDisplay()方法来返回EGLDisplay作为OpenGL ES的渲染目标。

if ( (mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)) == EGL14.EGL_NO_DISPLAY) {

throw new RuntimeException("unable to get EGL14 display"); }

b:初始化与 EGLDisplay 之间的连接:eglInitialize()。第一参数代表Major版本,第二个代表Minor版本。如果不关心版本号,传0或者null就可以了。

if (!EGL14.eglInitialize(mEGLDisplay, 0, 0)) {

throw new RuntimeException("unable to initialize EGL14"); }

c:获取 EGLConfig 对象:eglChooseConfig()。

int[] attribList = {

EGL14.EGL_RED_SIZE, 8,

EGL14.EGL_GREEN_SIZE, 8,

EGL14.EGL_BLUE_SIZE, 8,

EGL14.EGL_ALPHA_SIZE, 8,

EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES3_BIT,

EGL_RECORDABLE_ANDROID, 1,

EGL14.EGL_NONE

};

EGLConfig[] configs = new EGLConfig[1];

int[] numConfigs = new int[1];

EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,

numConfigs, 0);

d:创建 EGLContext 实例:接下来我们需要创建OpenGL的上下文环境 EGLContext 实例,这里值得留意的是,OpenGL的任何一条指令都是必须在自己的OpenGL上下文环境中运行,我们可以通过eglCreateContext()方法来构建上下文环境:

int[] attrib_list = {

EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,

EGL14.EGL_NONE

};

mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,

attrib_list, 0);

e:创建 EGLSurface 实例:通过eglCreateWindowSurface()方法创建一个实际可以显示的EGLSurface。

private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;

int[] surfaceAttribs = {

EGL14.EGL_NONE

};

mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, configs[0], mSurface,

surfaceAttribs, 0);

f:连接 EGLContext 和 EGLSurface:通过上面的步骤,EGL的准备工作做好了,一方面我们为OpenGL ES渲染提供了目标及上下文环境EGLContext,可以接收到OpenGl ES渲染出来的纹理;另一方面我们连接好了设备显示屏EGLSurface(这里指SurfaceView或者TextureView),接下来我们讲解如何在创建好的EGL环境下工作的。首先我们有一点必须要明确,OpenGL ES 的渲染必须新开一个线程,并为该线程绑定显示设备及上下文环境(EGLContext)。前面有说过OpenGL指令必须要在其上下文环境中才能执行。所以我们首先要通过 eglMakeCurrent()方法来绑定该线程的显示设备及上下文。

EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext);

g:当我们绑定完成之后,我们就可以进行RenderLoop循环了,使用 OpenGL ES API 绘制图形:gl_*() 。

h:绘制好之后,切换 front buffer 和 back buffer 送显:eglSwapBuffer()。EGL的工作模式是双缓冲模式,其内部有两个FrameBuffer(帧缓冲区,可以理解为一个图像存储区域),当EGL将一个FrameBuffer显示到屏幕上的时候,另一个FrameBuffer就在后台等待OpenGl ES进行渲染输出。直到调用了eglSwapBuffer()这条指令的时候,才会把前台的FrameBuffers和后台的FrameBuffer进行交换,这时界面呈现的就是OpenGL ES刚刚渲染的内容了。

EGL14.eglSwapBuffer();

i:断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease()。

j:删除 EGLSurface 对象,eglDestroySurface()。

EGL14.eglDestroySurface(display, surface);

k:删除 EGLContext 对象,

EGL14.eglDestroyContext(display, context);

l:终止与 EGLDisplay 之间的连接,

EGL14.eglTerminate(display);

5、EGL 环境搭建示例

import android.icu.text.UFormat;

import android.util.Log;

import android.view.Surface;

import android.view.SurfaceView;

import javax.microedition.khronos.egl.EGL;

import javax.microedition.khronos.egl.EGL10;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.egl.EGLContext;

import javax.microedition.khronos.egl.EGLDisplay;

import javax.microedition.khronos.egl.EGLSurface;

import static javax.microedition.khronos.egl.EGL10.EGL_NO_CONTEXT;

public class EGLHelper {

private EGL10 mEgl;

private EGLDisplay mEglDisplay;

private EGLContext mEglContext;

private EGLSurface eglSurface;

public void init(Surface surface, EGLContext eglContext){

//1.得到Egl实例

mEgl = (EGL10) EGLContext.getEGL();

//2.得到默认的显示设备(就是窗口)

mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);

//判断获取默认显示设备是否成功

if (mEglDisplay==EGL10.EGL_NO_DISPLAY){

throw new RuntimeException("eglGetDisplay failed");

}

//3.初始化默认显示设备(初始化EGL)

//主版本号和次版本号

int[] version=new int[2];

boolean initialize = mEgl.eglInitialize(mEglDisplay, version);

if (!initialize){

throw new RuntimeException("eglInitialize failed");

}

Log.e("ike","version:"+version[0]);

Log.e("ike","version:"+version[1]);

//4.设置显示设备的属性

int[] attribute=new int[] {

EGL10.EGL_RED_SIZE, 8,

EGL10.EGL_GREEN_SIZE, 8,

EGL10.EGL_BLUE_SIZE, 8,

EGL10.EGL_ALPHA_SIZE, 8,

EGL10.EGL_DEPTH_SIZE, 8,

EGL10.EGL_STENCIL_SIZE, 4,

EGL10.EGL_NONE};

//根据属性信息从系统的所有的配置信息中,获取支持该属性列表的配置信息的个数。一般来说就选取一个就好了

int[] num_config = new int[1];

boolean chooseConfig = mEgl.eglChooseConfig(mEglDisplay, attribute, null, 1, num_config);

if (!chooseConfig){

throw new RuntimeException("eglChooseConfig failed");

}

//判断是否选择到符合传入参数的配置信息

if (num_config[0]<=0){

throw new IllegalArgumentException(

"No configs match configSpec");

}

//5.从系统中获取对应属性的配置

EGLConfig[] eglConfigs=new EGLConfig[num_config[0]];

boolean eglChooseConfig = mEgl.eglChooseConfig(mEglDisplay, attribute, eglConfigs, num_config[0], num_config);

if (!eglChooseConfig){

throw new RuntimeException("eglChooseConfig$2 failed");

}

//6. 创建EglContext

//如果eglContext==null则创建新的egl上下文

int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 3,

EGL10.EGL_NONE };

if (eglContext==null){

mEglContext = mEgl.eglCreateContext(mEglDisplay, eglConfigs[0], EGL_NO_CONTEXT, null);

}else {

//根据传入eglContext创建可以共享的egl上下文

mEglContext = mEgl.eglCreateContext(mEglDisplay, eglConfigs[0], eglContext, null);

}

if (mEglContext==null||mEglContext== EGL_NO_CONTEXT){

mEglContext=null;

throw new RuntimeException("eglCreateContext failed");

}

//7.创建surface

eglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, eglConfigs[0], surface, null);

if (eglSurface==null||eglSurface==EGL10.EGL_NO_SURFACE){

eglSurface=null;

throw new RuntimeException("eglCreateWindowSurface failed");

}

//8.绑定EGLContext和surface到显示设备

boolean makeCurrent = mEgl.eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);

if (!makeCurrent){

Log.e("ike","eglMakeCurrent failed");

}

}

/**

* 刷新数据

*/

public void swapBuffers(){

if (mEgl!=null){

boolean eglSwapBuffers = mEgl.eglSwapBuffers(mEglDisplay, eglSurface);

if (!eglSwapBuffers){

Log.e("ike","eglSwapBuffers failed");

}

}

}

/**

* 获取EGL上下文

* @return

*/

public EGLContext getEGLCOntext(){

return mEglContext;

}

public void destoryEgl(){

if (mEgl!=null){

//与显示设备解绑,销毁eglsurface

mEgl.eglMakeCurrent(mEglDisplay,EGL10.EGL_NO_SURFACE,EGL10.EGL_NO_SURFACE,EGL_NO_CONTEXT);

mEgl.eglDestroySurface(mEglDisplay,eglSurface);

eglSurface=null;

//销毁上下文

mEgl.eglDestroyContext(mEglDisplay,mEglContext);

mEglContext=null;

//销毁显示设备

mEgl.eglTerminate(mEglDisplay);

mEglDisplay=null;

mEgl=null;

}

}

}

最后,欢迎大家一起交流学习:微信:liaosy666 ; QQ:2209115372 。

标签:OpenGL,及其,EGL,EGL10,EGL14,使用,ES,EGLContext

来源: https://blog.csdn.net/u010281924/article/details/105296617

java使用egl_EGL 作用及其使用相关推荐

  1. java序列化的作用

    java序列化的作用 1.序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法 ...

  2. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  3. 【Java学习笔记之一】java关键字及作用

    Java关键字及其作用 一. 总览: 1 访问控制 2 private protected public 3 4 类,方法和变量修饰符 5 abstract class extends final i ...

  4. java内存模型作用是什么_什么是JVM内存模型?

    本篇文章带大家初步了解一下JVM内存模型,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 计算机内存模型 在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问 ...

  5. Java设计模式的作用

    Java设计模式的作用是帮助程序员解决常见问题和开发过程中的设计问题.设计模式是面向对象设计的一种常见方法,用于组织对象之间的关系,使得对象之间能够更加灵活地协同工作.使用设计模式可以使代码更加结构化 ...

  6. java关键字的作用_java关键字及其作用

    java关键字及其作用 java 关键字及其作用 一. 关键字总览:关键字 含义abstract 表明类或者成员方法具有抽象属性assert 用来进行程序调试boolean 基本数据类型之一,布尔类型 ...

  7. java虚拟作用机的作用,java虚拟机及其作用介绍

    Java,是于1995年5月被推出的Java程序设计语言和Java平台的总称.那么java虚拟机又是什么,有什么作用,感兴趣的网友们跟着小编继续往下了解吧! java虚拟机 什么是java虚拟机 Ja ...

  8. 简单一文带你读懂Java变量的作用和三要素

    Java变量的作用 不只是java,在其他的编程语言中变量的作用只有一个:存储值(数据) 在java中,变量本质上是一块内存区域,数据存储在java虚拟机(JVM)内存中 变量的三要素 变量的三要素分 ...

  9. Java反射的作用和原理

    Java反射的作用和原理 概念:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的 ...

  10. Java反射的作用与原理

    Java反射的作用与原理 定义 反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法.在Java ...

最新文章

  1. 世界互联网大会上发布的《中国互联网发展报告2020》显示——中国人工智能专利申请数跃居世界第一...
  2. 融合的胜利——惠普连发SDS、闪存、超融合方案
  3. IBM System p5 服务器 HACMP 安装指南
  4. mysql表设计要注意什么?
  5. echart模块化单文件引入
  6. 达思sql数据库修复软件:用友金蝶管家婆思迅中了勒索病毒怎么办?
  7. excel只计算隐藏不计算机,excel计算公式求和_excel中如何让隐藏数据不参与求和计算?_excel表格数据求和...
  8. Map集合简单应用的例子(世界杯)
  9. Frament与activity切换
  10. 你身边长期不上班的人,靠什么活着?
  11. spring boot对外部文件的访问
  12. vue三级路由router-view不显示问题,路由嵌套不显示
  13. Python小白机器学习教程:Sklearn精讲
  14. 计算机二级报名时间2020年3月山西,2020年3月山西计算机二级报名及考试时间
  15. DM DISQL使用
  16. 元宇宙只是未来技术演化的外衣
  17. OKR和KPI如何结合使用
  18. 搭建webgis开发环境
  19. OpenVINO 2022.3之七:OpenVINO 预处理API提升模型推理性能
  20. Java—— this 关键字(实例是什么?)

热门文章

  1. SQL Server排序规则
  2. 图的应用:骑士周游问题
  3. 表示整数x的绝对值大于5时值为真的c语言表达式是——.,1表示'整数x的绝对值大于5'时值为'真'的C语言表达式是_____...
  4. linux系统下 blast,Linux下BLAST安装及BLAST使用
  5. MSP430编程器仿真器JTAG、SBW、BSL接口的区别
  6. 《暗通道优先的图像去雾算法》读书笔记
  7. matlab语音识别系统(源代码),matlab语音识别系统(源代码)
  8. 初窥门径——字典的更好使用方式
  9. Java端实现JSHOP2的调用
  10. 《黑白团团队》第九次团队作业:Beta冲刺第三天