2013-10-06 109 views
17

我想進入EGL。但是,我能找到的「唯一」是API參考。搜索「egl guide」,「egl tutorial」或「egl for beginners」沒有成功。有誰知道一個好的資源?初學者EGL指南

EGL可能不是「初學者的圖書館」。在那種情況下,我想我應該從頭開始 - 但是,開始是什麼?我剛剛讀到EGL是一個依賴於系統的繪圖API的抽象層,因此是「正確」的方法。 Wayland使用它,而kmscon也使用它。縱觀他們的源代碼,但只讓我頭疼。作爲一個方面說明,我對C++感覺更加舒適(儘管我猜想,如果它在C上工作,它也可以在C++上工作)。另外,我正在使用最新的內核,並帶有最新的Mesa版本,所以我猜想有可用的EGL支持。

+2

儘管「無題」,我發現這個問題對解決其他「主題」問題非常有用。 –

+0

相關:http://stackoverflow.com/questions/3127360/what-is-egl-and-how-can-i-use-it –

回答

13

要開始學習EGL,我推薦以下資源。

  • OpenGL ES 3.0 Programming Guide由Addison-Wesley出版社提供有關使用EGL與OpenGL ES的一個很好的教程,完成example code 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 Quick Reference Card

  • (僅用於Linux)EGL_EXT_platform_x11擴展規範的示例代碼演示瞭如何創建X11窗口,從該窗口產生EGLSurface。 (來自OpenGL ES 3.0編程指南的示例程序也演示瞭如何做到這一點,但您可能會發現EGL_EXT_platform_x11規範中更關注的處理更容易遵循)。

  • (僅適用於Linux)同樣,EGL_MESA_platform_gbm擴展規範演示瞭如何做同樣的,但對於GBM,無頭EGL後端通過開源的Linux驅動程序的支持。(該的OpenGL ES 3.0編程指南不碰GBM)。

根據你的目標,你也可以找到有用以下的低級別的資源,在Khronos的EGL註冊的所有發現。

+0

您賦予的資源不適用於EGL,它適用於嵌入系統的「opengl ES」 –

+0

顯然,本書的重點是OpenGL ES。畢竟,「OpenGL ES 3.0編程指南」是本書的標題。但它也包含了對EGL的明確介紹,因爲這兩個API密切相關。 – Chadversary

0

我不知道任何教程,以幫助你,但我發現this example有用的Android

3

編輯:我最近發現由Addison-Wesley出版了一本很好的EGL教程。有關詳細信息,請參閱我的new answer。此答案已過時,但應保留,因爲它仍包含有用的信息。

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

EGL 1.5是用於創建OpenGL和OpenGL ES上下文的低級系統API;將這些上下文連接到窗口系統;並在應用程序,窗口系統和其他系統組件(如OpenCL,視頻解碼引擎和相機硬件)之間共享圖形緩衝區和圖形事件。

考慮EGL的目標用例和開發商的觀衆,我感到意外,沒有教程存在。

如果您正在研究如何使用EGL完成某些任務,並且您正在使用Linux與開源OpenGL驅動程序,那麼您可以通過聯繫Mesa開發人員來找到答案[http://mesa3d.org/lists.html]

+0

謝謝,我已經瞭解EGL。我會寫一些帖子,或者提交文檔化的源代碼。 – Kalrish

+0

這個答案不再正確。我發現了由Addison-Wesley發佈的EGL教程。看到我對卡里什問題的新答案。 – Chadversary

2

我發現這個適用於iOS的tutorial適用於Windows,this適用於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); 
7

我有點意外的是,eglIntro尚未提及。
這是我能找到的最接近教程的東西,在學習EGL時是一個非常有用的資源。

+0

我很確定,當我搜索時,它不在那裏。謝謝 :)。 – Kalrish