初学者的EGL指南

30

我想学习EGL技术,但是我只找到了API参考文档。搜索“egl指南”,“egl教程”或“初学者egl”没有成功。有人知道好的资源吗?

EGL可能不是一个适合初学者的库。在这种情况下,我应该从头开始 - 但是,什么是起点呢?我刚才看到EGL是系统相关绘图API的抽象层,因此是“正确”的选择。Wayland使用它,kmscon也使用它。但是查看它们的源代码只会让我头痛。

附言:顺便说一句,我更喜欢C++(虽然我想如果它可以在C上运行,那么它应该也可以在C++上运行)。此外,我正在使用最新的内核和最新的Mesa发布版,因此我想EGL应该得到支持。


3
尽管这个问题有些“离题”,但我发现它对解决其他“主题内”的问题非常有帮助。 - Adrian Maire
相关:https://dev59.com/1HA75IYBdhLWcg3wv70j - Ciro Santilli OurBigBook.com
5个回答

23

如果想学习EGL,我建议您参考以下资源。

  • 来自Addison-Wesley的OpenGL ES 3.0编程指南为使用EGL和OpenGL ES提供了一份很好的教程,其中包含在Github上的示例代码。该书介绍了独立于操作系统的EGL部分。为了覆盖操作系统特定的部分,该书的示例代码提供了一个完整的程序,可以在每个主要的操作系统上运行。(Addison-Wesley是许多著名OpenGL书籍的出版商,比如红宝书OpenGL超级圣经)。

    Dan Ginsburg, Budirijanto Purnomo, Dave Shreiner, Aaftab Munshi. OpenGL ES 3.0编程指南, 2e, 第3章:EGL简介。Addison-Wesley,2014年。ISBN-13:978-0-321-93388-1,ISBN-13:978-0-13-344016-4。

  • 在学习过程中,将官方的EGL 1.4快速参考卡放在身边。

  • (仅适用于Linux) EGL_EXT_platform_x11扩展规范中的示例代码演示了如何创建一个X11窗口并从该窗口生成一个EGLSurface。(来自OpenGL ES 3.0编程指南的示例程序也演示了如何完成此操作,但您可能会发现EGL_EXT_platform_x11规范的更专注的处理方式更容易理解)。

  • (仅适用于Linux) 同样,EGL_MESA_platform_gbm 扩展规范演示了如何在GBM上完成相同的操作。GBM是一种无头EGL后端,由开源Linux驱动程序支持。(《OpenGL ES 3.0编程指南》不涉及GBM)。

  • 根据您的目标,您还可能会发现以下低级资源有用,这些资源都可以在Khronos EGL注册表中找到。


    1
    你提供的资源不是针对EGL的,而是针对“OpenGL ES”的,这是嵌入式系统的图形库。 - Hassen Dhia
    显然,这本书的主要重点是OpenGL ES。毕竟,“OpenGL ES 3.0编程指南”就是这本书的标题。但它也包含了对EGL的清晰介绍,因为这两个API密切相关。 - Chadversary

    13

    我有些惊讶的是还没有提到eglIntro
    这是我找到的最接近教程的东西,在学习EGL时非常有用。


    我很确定在我搜索时那里没有它。谢谢 :)。 - djsp

    3
    编辑:我最近发现Addison-Wesley出版了一份很好的EGL教程。请查看我的新回答以获取详情。本回答已经过时,但应予保留因为它仍包含有用的信息。

    我不知道有任何EGL教程。我所知道的唯一文档是:

    EGL 1.5是一个底层的系统API,用于创建OpenGL和OpenGL ES上下文;将这些上下文连接到窗口系统;以及在应用程序、窗口系统和其他系统组件(如OpenCL、视频解码引擎和摄像机硬件)之间共享图形缓冲区和图形事件。

    考虑到EGL的目标用例和开发者受众,我并不惊讶没有教程存在。

    如果您正在研究如何使用EGL完成某个任务,并且您正在使用带有开源OpenGL驱动程序的Linux,则可以通过联系Mesa开发人员[<http://mesa3d.org/lists.html>]找到答案。


    谢谢,我已经理解了EGL。当我有机会时,我会写一些文章或提交文档化的源代码。 - djsp
    这个答案已经不正确了。我找到了Addison-Wesley出版的一个很好的EGL教程。请看我的新回答,针对Kalrish的问题。 - Chadversary

    2
    我找到了这篇iOS的教程,还有Windows的教程
    以下是从后者中提取的一些示例代码,用于获取显示并使用EGL进行配置:
    // Obtain an EGL display object.
    EGLDisplay display = eglGetDisplay(GetDC(hWnd));
    if (display == EGL_NO_DISPLAY)
    {
      return EGL_FALSE;
    }
    
    // Initialize the display
    if (!eglInitialize(display, &majorVersion, &minorVersion))
    {
      return EGL_FALSE;
    }
    
    // Obtain the display configs
    if (!eglGetConfigs(display, NULL, 0, &numConfigs))
    {
      return EGL_FALSE;
    }
    
    // Choose the display config
    if (!eglChooseConfig(display, attribList, &config, 1, &numConfigs))
    {
      return EGL_FALSE;
    }
    
    // Create a surface
    surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)hWnd, NULL);
    if (surface == EGL_NO_SURFACE)
    {
      return EGL_FALSE;
    }
    
    // Create a drawing context from the EGLDisplay
    context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
    if (context == EGL_NO_CONTEXT)
    {
        return EGL_FALSE;
    }
    
    // Make the context current
    if (!eglMakeCurrent(display, surface, surface, context))
    {
        return EGL_FALSE;
    }
    
    //to show your drawing you swap the buffers like this
    eglSwapBuffers(drawContext->eglDisplay, drawContext->eglSurface);
    
    //Terminating a display (release the window resources)
    EGLBoolean eglTerminate(eglDisplay);
    

    0

    我不知道有什么教程可以帮助你,但我发现这个例子对于Android很有用。


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