EGL 是OpenGL ES和本地窗口系统的接口,不同平台上EGL配置是不一样的,而 OpenGL的调用方式是一致的,就是说:OpenGL跨平台就是依赖于EGL接口。 EGL10.EGL_GREEN_SIZE, mGreenSize, EGL10.EGL_BLUE_SIZE, mBlueSize, EGL10 .EGL_ALPHA_SIZE, mAlphaSize, EGL10.EGL_DEPTH_SIZE, mDepthSize, EGL10. EGL_STENCIL_SIZE, mStencilSize, EGL10.EGL_RENDERABLE_TYPE, mRenderType,//egl版本 2.0 EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); mEgl.eglDestroySurface
2、EGL和OpenGL ES的关系 从上面的讲解我们基本上可以知道,EGL 为OpenGL提供绘制表面。或者说EGL是OpenGl ES的渲染画布。 if ( (mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY)) == EGL14.EGL_NO_DISPLAY) { EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES3_BIT, EGL_RECORDABLE_ANDROID, 1, .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
OpenGL ES的javax.microedition.khronos.opengles 包定义了平台无关的GL绘图指令,EGL(javax.microedition.khronos.egl )则定义了控制 使用EGL的绘图的一般步骤: 获取EGLDisplay对象 初始化与EGLDisplay 之间的连接。 EGLSurface对象 删除EGLContext对象 终止与EGLDisplay之间的连接 一般来说在平台上开发OpenGL ES应用,无需直接使用javax.microedition.khronos.egl
EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, 10 EGL14.EGL_NONE, 11 }; 首先定义 EGLConfig EGL14.EGL_NONE, 4 }; 同样,还是以 EGL14.EGL_NONE 结尾。 (mEGLDisplay, mEGLConfig, EGL14.EGL_NO_CONTEXT, EGL_ATTRIBUTE, 0); 4 if (mEGLContext == EGL14.EGL_NO_CONTEXT .EGL_WIDTH, w, 4 EGL10.EGL_HEIGHT, h, 5 EGL10.EGL_NONE, 6 }; 7 1 EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT
Surface也有一些attribute,基本上都可以故名思意,EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET const EGLint pi32ConfigAttribs[] = { EGL_LEVEL, 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT , EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NATIVE_RENDERABLE, EGL_FALSE, = EGL_NO_DISPLAY) { eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT 这也是EGL的作用之一。
( native-lib EGL GLESv2 android log ) 书写EglHelper,这个类主要负责egl , 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8,// 眼睛屏幕的距离 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,//版本号 = EGL_NO_DISPLAY && mEglSurface ! , EGL_NO_SURFACE, EGL_NO_CONTEXT); //销毁surface 和 eglContext if (mEglSurface !
OpenGL ES 的平台无关性正是借助 EGL 实现的,EGL 屏蔽了不同平台的差异(Apple 提供了自己的 EGL API 的 iOS 实现,自称 EAGL)。 EGL 的应用 ? [] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, EGL_SURFACE_TYPE,EGL_PBUFFER_BIT ,//EGL_WINDOW_BIT EGL_PBUFFER_BIT we will create a pixelbuffer surface EGL_RED_SIZE, 8, = EGL_NO_DISPLAY) { eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT
但是没有“大棒”迫使他们遵循 EGL 所需的 gas 限制,EGL 不能强迫矿池将他们的 gas 限制调整到他们认为不安全的水平。 为 EGL 创造价值。 EGL 旨在快速部署 ETH-EGL 平衡器池,并在数周内将 EGL 几乎完全授予矿池,他们只能通过遵循 EGL 所需的气体限制来收集。 这是为了提供旋转飞轮的最佳设置:“EGL 具有价值”->“池跟随 EGL”->“EGL 起作用,因此演员投票”->“EGL 具有价值”。 激励大型参与者的参与。 EGL 中并投票决定失去他们的价值从 EGL 捕获。 EGL 如何提供帮助 我们意识到EGL 可能是平滑过渡到 EIP-1559 的完美桥梁。
今天我就给大家介绍一下 EGL. 什么是EGL EGL是一套用于管理绘制Surface的API。它的运行机制如下: 与系统的本地窗口进行通信。 查询绘制Surface的有效类型与配置。 使用 EGL 的步骤 可以把 EGL 看作是 OpenGL ES 与 本地窗口系统之间的胶水层。 的内部数据结构,如果EGL初始化失败,就会返回EGL_FALSE。 .EGL_NO_SURFACE 和 EGL14.EGL_NO_CONTEXT,这样就将两者的关系断开了。 eglMakeCurrent( mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE
这段代码的作用是选择EGL配置, 即可以自己先设定好一个你希望的EGL配置,比如说RGB三种颜色各占几位,你可以随便配,而EGL可能不能满足你所有的要求,于是它会返回一些与你的要求最接近的配置供你选择。 这段代码的作用就是用从上一步EGL返回的配置列表中选择一种配置,用来创建EGL Context。 (5)获取Surface ? 可以看到,在底层,它会去拿一个context,实际上这个context就是保存在底层的EGL context,而这个EGL context,它是Thread Specific的。 答:因为调用OpenGL接口时,在底层会获取Thread Specific的EGL Context,因此通常情况下,不同线程获取到的EGL Context是不一样的,而texture又放在EGL Context 答:在一个线程中调用eglCreateContext()里传入另一个线程的EGL Context作为share context,或者先让一个线程解绑EGL Context,再让另一个线程绑定这个EGL
可以使用EGL Pixmap例子测试MPSoC GPU性能。运行EGL Pixmap,要使用fbdev作为egl backend。
OpenGL ES 的平台无关性正是借助 EGL 实现的,EGL 屏蔽了不同平台的差异(Apple 提供了自己的 EGL API 的 iOS 实现,自称 EAGL)。 EGL 的应用 EGL 后台渲染实现效果图 使用 EGL 渲染的一般步骤: 获取 EGLDisplay 对象,建立与本地窗口系统的连接 调用 eglGetDisplay 方法得到 EGLDisplay [] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, EGL_SURFACE_TYPE,EGL_PBUFFER_BIT ,//EGL_WINDOW_BIT EGL_PBUFFER_BIT we will create a pixelbuffer surface EGL_RED_SIZE, 8, = EGL_NO_DISPLAY) { eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT
: Could not get EGL display connection No EGL Display nvbufsurftransform: Could not get EGL display connection No EGL Display nvbufsurftransform: Could not get EGL display connection No EGL Display not get EGL display connection No EGL Display nvbufsurftransform: Could not get EGL display connection No EGL Display nvbufsurftransform: Could not get EGL display connection No EGL Display nvbufsurftransform : Could not get EGL display connection No EGL Display nvbufsurftransform: Could not get EGL display
初始化EGL的过程其实就是配置以上几个信息的过程。 二、如何使用EGL 单单看上面的介绍,其实还是比较难理解EGL究竟有什么作用,或者应该怎么样去使用EGL。 : EGL14.EGL_NO_CONTEXT // 1,创建 EGLDisplay mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY EGL14.EGL_BLUE_SIZE, 8, EGL14.EGL_ALPHA_SIZE, 8, //EGL14.EGL_DEPTH_SIZE, 16, .eglMakeCurrent( mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14 EGL14.eglMakeCurrent( mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE,
, EGL_OPENGL_ES2_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE int attribs[] = { EGL10.EGL_LEVEL, 0, EGL10.EGL_RENDERABLE_TYPE, 4, // EGL_OPENGL_ES2_BIT EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER, EGL10.EGL_RED_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_BLUE_SIZE, EGL10.EGL_SAMPLES, 4, // 在这里修改MSAA的倍数,4就是4xMSAA,再往上开程序可能会崩 EGL10.EGL_NONE };
= EGL_NO_DISPLAY; // EGL上线问 EGLContext m_egl_cxt = EGL_NO_CONTEXT; // EGL配置 EGLConfig , 2, EGL_NONE}; m_egl_cxt = eglCreateContext(m_egl_dsp, m_egl_cfg, share_ctx, attr); if (m_egl_cxt eglMakeCurrent(m_egl_dsp, egl_surface, egl_surface, m_egl_cxt)) { LOGE(TAG, "EGL make current = EGL_NO_DISPLAY) { eglMakeCurrent(m_egl_dsp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) ); } m_egl_dsp = EGL_NO_DISPLAY; m_egl_cxt = EGL_NO_CONTEXT; m_egl_cfg = NULL; } 说明一下
不同设备的窗口系统千变万化,但是OpenGL ES提供的API却是统一的,所以EGL需要协调当前设备的窗口系统和OpenGL ES。下面EGL初始化的代码我是用C++写的,然后通过jni调用。 EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,//EGL_WINDOW_BIT EGL_PBUFFER_BIT we will create a pixelbuffer surface EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, buffer EGL_STENCIL_SIZE,8, EGL_NONE }; // EGL context attributes LOGI("provided EGL_WIDTH and EGL_HEIGHT is invalid"); break; case EGL_BAD_MATCH:
: OPENGL EGL是OpenGl 和Native底层之间的视图接口。 OPENGL生成图片数据(具体流程见图形学的图元处理部分,其完全由GPU处理)后保存到EGL创建的surface的buffer中,通过EGL的接口显示到窗口上 一句话总结:EGL获取Buffer用于和屏幕打交道 的swapBuffer置换缓存,让Opengl去渲染,自己在继续生成下一个buffer的数据 Display和EGL关系 EGL有很多版本,不同设备也有多个Display通过displayID去区分(典型的场景是车机上的多联屏 只有EGL才可以对接屏幕显示,OPENGL只是操作GOU进行绘制图像) 参考文章 OPENGL ES 2.0 知识串讲(2)――EGL详解 OpenGL ES: (3) EGL、EGL绘图的基本步骤 、EGLSurface、ANativeWindow 创建2个egl
int EGLCore::Init(EGLContext shared_context, int egl_version) { if (egl_version == 0) { egl_version EGL_ALPHA_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_SURFACE_TYPE , EGL_WINDOW_BIT, EGL_NONE }; if ((display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY (egl_surface_ == EGL_NO_SURFACE)); } 上面最终渲染的process_id就是和FBO绑定的纹理。
不同设备的窗口系统千变万化,但是OpenGL ES提供的API却是统一的,所以EGL需要协调当前设备的窗口系统和OpenGL ES。下面EGL初始化的代码我是用C++写的,然后通过jni调用。 EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,//EGL_WINDOW_BIT EGL_PBUFFER_BIT we will create a pixelbuffer surface EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, buffer EGL_STENCIL_SIZE,8, EGL_NONE }; // EGL context attributes LOGI("provided EGL_WIDTH and EGL_HEIGHT is invalid"); break; case EGL_BAD_MATCH: