EGL和OpenGL之间有什么关系?

时间:2011-08-10 20:20:19

标签: opengl opengl-es egl openvg

我正在OpenVG中编写OpenGL|ESGo的实现,这两个实现都取决于Khronos EGL API,据说可以简化可移植性。

我出于乐趣和教育的原因在OpenGL ES上编写OpenVG的实现 - 我没有做过很多渲染工作,我想更多地了解开放API并实践明确定义的标准(如果我得到了正确的结果,更容易看到)。

根据我的理解,EGL提供了一个标准API,用于检索绘图上下文(或者正确调用的内容),而不是使用多个OS提供的API之一(GLX,WGL等)

enter image description here

我很难相信Khronos会经历这样的努力并将标准OpenGL从循环中移开但事实是,我还没有发现OpenGL(真正的交易)如何或者是否与EGL接口或者它是否只是OpenGL ES。如果OpenGL ES可以使用EGL的绘图上下文,那么标准OpenGL是否也可以使用?

我对这一切都很陌生,这就是为什么我很兴奋,但我正在做的真正项目是一个Go小部件工具包,它利用OpenVG进行绘图操作,并尽可能使用硬件加速。

如果OpenVG,OpenGL和OpenGL ES依赖于EGL,我认为我的问题可以用“是”或“否”来回答。请记住,我昨晚首先进入了这个主题。

OpenGL是否使用或依赖于EGL?


关闭主题,但没有EGL标记。应该有吗?

3 个答案:

答案 0 :(得分:13)

OpenGL和EGL之间没有任何关系。 EGL通常不能在桌面上运行,也无法通过EGL创建桌面OpenGL上下文。

OpenGL上下文由特定于平台的API创建和管理。在Windows上,使用WGL API。在基于X11的平台上,使用GLX。等等。

去年Khronos发布了一些关于创建一个可以在桌面上运行并制作OpenGL上下文的EGL版本的声音,但到目前为止,没有任何结果。

答案 1 :(得分:11)

您可以通过EGL_OPENGL_APIeglBindAPI(EGLenum api)绑定为您线程的当前API;随后的eglCreateContext将创建一个OpenGL渲染上下文。

来自EGL spec,p42:

  

本节中描述的一些函数使用当前渲染API,该API是基于每个线程设置的   通过调用

     

EGLBoolean eglBindAPI(EGLenum api);

     

api必须指定一个受支持的客户端API,EGL_OPENGL_API,   EGL_OPENGL_ES_API或EGL_OPENVG_API

需要注意的是,EGL实现完全在其权限范围内,不支持EGL_OPENGL_API,如果您尝试绑定它,则会生成EGL_BAD_PARAMETER错误。

如果没有拿起AGL / WGL / GLX,也很难链接到libGL;这些平台上的ABI要求libGL提供这些入口点。根据您正在玩的平台,这可能是也可能不是问题。

答案 2 :(得分:7)

  

OpenGL是否使用或依赖于EGL?

没有。您可以在没有EGL的情况下运行OpenGL。

但是可以让EGL实现能够创建桌面OpenGL上下文。这是因为EGL的eglBindAPI(int api)允许EGL_OPENGL_API,EGL_OPENGL_ES_API或EGL_OPENVG_API。

但如果你问:

  

OpenGL-ES是使用还是依赖于EGL?

答案是肯定的,但有例外

目前(2015年),您有多个依赖 EGL 创建图形上下文的OpenGL-ES实现:Google ANGLE,PowerVR,ARM MALI,Adreno,AMD,Mesa等。

但是在最新版本的NVIDIA和英特尔驱动程序中,您还可以直接请求OpenGL-ES上下文,其中扩展名为 WGL_EXT_create_context_es_profile WGL_EXT_create_context_es2_profile 可用(Windows)。在Unix平台上也可以使用 GLX_EXT_create_context_es_profile GLX_EXT_create_context_es2_profile 扩展名。

EGL的目的是让开发人员轻松自如。通过创建一种可移植的标准方式来初始化和获取支持的图形API的上下文,而不必担心平台特定的问题,如WGL,GLX等。这是EGL实现者的问题,而不是最终的程序员。