30

我想进入 EGL。但是,我能找到的“唯一”是 API 参考。搜索“egl 指南”、“egl 教程”或“egl 初学者”没有成功。有人知道好的资源吗?

EGL 可能不是“初学者的图书馆”。在那种情况下,我想我应该从头开始 - 但是,开始是什么?我刚刚读到 EGL 是依赖于系统的绘图 API 的抽象层,因此是“正确”的方式。Wayland 使用它,kmscon 也是如此。但是,查看他们的源代码只会让我头疼。

PS:作为旁注,我对 C++ 感觉更舒服(尽管我猜想,如果它适用于 C,它应该也适用于 C++)。另外,我使用的是最新的内核和最新的 Mesa 版本,所以我想 EGL 可以支持。

4

5 回答 5

22

要开始学习 EGL,我推荐以下资源。

  • Addison-Wesley的OpenGL ES 3.0 编程指南提供了一个很好的教程,介绍了将 EGL 与 OpenGL ES 结合使用,并在 Github 上提供了示例代码。本书的文本介绍了独立于操作系统的 EGL 部分。为了涵盖操作系统的特定部分,本书的示例代码提供了一个适用于每个主要操作系统的完整程序。(Addison-Wesley 是许多著名的 OpenGL 书籍的出版商,例如The Red BookOpenGL SuperBible)。

    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 Programming Guide中的示例程序也演示了如何执行此操作,但您可能会发现 EGL_EXT_platform_x11 规范中更集中的处理更容易遵循)。

  • (仅限 Linux)同样,EGL_MESA_platform_gbm扩展规范演示了如何做同样的事情,但对于 GBM,开源 Linux 驱动程序支持的无头 EGL 后端。(OpenGL ES 3.0 编程指南不涉及 GBM)。

根据您的目标,您还可以在 Khronos EGL Registry 中找到以下有用的低级资源。

于 2014-05-11T06:50:25.660 回答
13

我有点惊讶eglIntro还没有被提及。
这是我能找到的最接近教程的,并且是学习 EGL 时非常有用的资源。

于 2014-09-13T08:31:29.153 回答
3

编辑: 我最近发现了 Addison-Wesley 发布的一个很好的 EGL 教程。有关详细信息,请参阅我的新答案。此答案已过时,但应保留,因为它仍然包含有用的信息。

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

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

考虑到 EGL 的目标用例和开发人员受众,我对不存在任何教程并不感到惊讶。

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

于 2014-04-19T05:45:22.090 回答
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);
于 2014-05-11T00:24:07.733 回答
0

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

于 2013-10-08T12:36:50.440 回答