适用于初学者的EGL指南

时间:2013-10-06 18:10:45

标签: egl

我想进入EGL。但是,我能找到的“唯一”是API参考。搜索“egl guide”,“egl tutorial”或“egl for beginners”并没有成功。有谁知道一个好的资源?

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

P.S。:作为旁注,我对C ++感觉更舒服(虽然我猜想,如果它适用于C,它也应该适用于C ++)。另外,我正在使用最新的内核,以及最新的Mesa版本,所以我猜有可用于EGL的支持。

5 个答案:

答案 0 :(得分:16)

要开始学习EGL,我建议使用以下资源。

  • 来自Addison-Wesley的OpenGL ES 3.0 Programming Guide提供了一个很好的教程,可以在Github上使用带有example code的OpenGL ES使用EGL。本书的文本介绍了独立于操作系统的EGL部分。为了涵盖操作系统特定部分,本书的示例代码提供了适用于每个主要操作系统的完整程序。 (Addison-Wesley是许多着名的OpenGL书籍的出版商,例如 The Red Book OpenGL 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 Quick Reference Card官方留在您身边。

  • (仅限Linux) EGL_EXT_platform_x11扩展规范中的示例代码演示了如何创建X11窗口并从该窗口生成EGLSurface。 ( OpenGL ES 3.0编程指南中的示例程序也演示了如何执行此操作,但您可能会发现更容易遵循EGL_EXT_platform_x11规范中更集中的处理方法。

  • (仅限Linux)同样,EGL_MESA_platform_gbm扩展规范演示了如何执行相同操作,但对于GBM,开源Linux驱动程序支持的无头EGL后端。 OpenGL ES 3.0编程指南不接触GBM。

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

答案 1 :(得分:10)

我对eglIntro尚未被提及感到有些惊讶 它是我能找到的最接近的教程,在学习EGL时是一个非常有用的资源。

答案 2 :(得分:3)

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

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

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

考虑到EGL的目标用例和开发人员,我不知道没有教程存在。

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

答案 3 :(得分:2)

我发现iOS tutorial和Windows this

这是从后者中提取的一些示例代码,用于获取显示并使用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);

答案 4 :(得分:0)

我不知道任何帮助您的教程,但我发现this example对Android很有用