EGL和OpenGL之间有什么关系?

28
我正在使用Go编写OpenVGOpenGL|ES的实现,两者都依赖于Khronos EGL API,这样可以更容易地移植。
我正在为了娱乐和教育目的而在OpenGL ES之上实现OpenVG - 我没有做过太多渲染工作,我想学习更多关于开放API的知识,并练习实现明确定义的标准(更容易看到是否得到了正确的结果)。
据我所知,EGL提供了一个标准API来检索绘图上下文(或者它应该被正确称为什么),而不是使用多个操作系统提供的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标签。应该加上吗?


你的 Go 小部件项目已经被放弃了吗? - Hai Phaikawl
相关:https://dev59.com/1HA75IYBdhLWcg3wv70j - Ciro Santilli OurBigBook.com
3个回答

16
您可以通过调用 eglBindAPI(EGLenum api) 绑定当前API作为您的线程的API,从而创建OpenGL渲染上下文。根据EGL规范第42页所述,该部分描述的一些函数使用当前渲染API,该API在每个线程上以调用方式设置:

EGLBoolean eglBindAPI(EGLenum api);

api必须指定支持的客户端API之一,即EGL_OPENGL_API、EGL_OPENGL_ES_API或EGL_OPENVG_API。

但是要注意的是,如果尝试绑定不支持的EGL_OPENGL_API,则EGL实现有权不支持该操作并生成EGL_BAD_PARAMETER错误。 此外,在链接libGL时很难避免AGL/WGL/GLX等附加项;这些平台上的ABI要求libGL提供这些入口点。这可能是一个问题,具体取决于您使用的平台。

12

OpenGL是否使用或依赖于EGL?

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

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

但是如果您问:

OpenGL-ES是否使用或依赖于EGL?

答案是肯定的,但也有例外

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

但是在最近的 NVIDIA 和 Intel 驱动程序中,您还可以直接请求 OpenGL-ES 上下文,其中扩展WGL_EXT_create_context_es_profileWGL_EXT_create_context_es2_profile可用(Windows)。 在 Unix 平台上也是如此,其中GLX_EXT_create_context_es_profileGLX_EXT_create_context_es2_profile扩展可用。
EGL 的目的是通过创建一种便携式和标准化的方式来初始化和获取支持的图形 API 的上下文,而不必担心平台特定问题,如 WGL、GLX 等。 这是 EGL 实现者的问题,而不是最终程序员的问题。

我在我的Ubuntu 14.04上安装了NVIDIA的最新驱动程序(版本364),发现有libGL.so,libGLESv2.so,libEGL.so。这是否意味着我可以使用EGL在我的桌面上创建窗口上下文,并在我的Ubuntu桌面上使用OpenGL 4.5? - Robert Wang
1
绑定到libEGL.so并调用EGL函数查询对OpenGL的支持。请参见https://dev59.com/ZWAg5IYBdhLWcg3w0Nze。步骤:(1)使用eglGetDisplay(...)获取显示器;(2)使用eglInitialize(display,...);(3)使用包含对{ EGL_RENDERABLE_TYPE,EGL_OPENGL_BIT EGL_CONFORMANT,EGL_OPENGL_BIT ... }成对的attrib_list的eglChooseConfig(...);(4)使用eglCreateContext(...)。 - Alex Byrth
但是从EGL卡片上来看,它指出EGL仅支持OpenGL 1.x和2.x版本。我还没有尝试过。 - Alex Byrth
谢谢提供的信息。还有一个问题。我不明白为什么我们需要使用Mesa驱动程序(在那篇文章中提到)。NV驱动程序缺少什么? - Robert Wang
1
修改的注释!如果您已经有libEGL.so,就不需要担心mesa了。只需绑定到您的EGL并感到高兴即可。 - Alex Byrth
谢谢。我会在有时间的时候尝试一下。 - Robert Wang

6
OpenGL和EGL之间没有关系。 EGL通常不运行在桌面上,并且没有通过EGL创建桌面OpenGL上下文的能力。
相反,OpenGL上下文由特定于平台的API创建和管理。 在Windows上,使用WGL API。 在基于X11的平台上,使用GLX。等等。
去年Khronos有些声音表示要创建一个可以在桌面上工作并创建OpenGL上下文的EGL版本,但目前为止还没有任何进展。

2
@humanityANDpeace:我从Mesa网站上粗略看了一下,不清楚你是否可以使用Mesa3D和EGL创建桌面OpenGL上下文。此外,Wayland并不是非常普及。因此,目前我不认为有必要改变任何已经说过的话。如果Mir得到Linux的广泛采用,那么也许会改变。或者如果NVIDIA能够让大量桌面OpenGL运行,也许会有所改变。但目前,“EGL 通常不能在桌面上运行”的声明仍然是正确的。 - Nicol Bolas
1
@humanityANDpeace:“我不明白为什么你提到 Mesa、Wayland 和最令人困惑的 Ubuntu-MIR。” 因为它们几乎是桌面 OpenGL 的唯一 EGL 提供者。除非你知道其他我(和维基百科)不知道的提供者。 - Nicol Bolas
17
自2011年(或更早)开始,X11上的EGL在Mesa中支持创建桌面OpenGL上下文。 - Chadversary
19
Wayland 显示服务器协议使用 EGL,这个答案现在已经完全过时了。 - Janus Troelsen
5
这个回答已经过时了,能否更新或删除它? - rdb
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接