EGL Reference Page를 살펴보면 아래와 같은 설명이 있습니다.
EGL은 크로노스 렌더링 API(OpenGL, OpenGL ES, OpenVG)와 아래 단의 네이티브 플랫폼 윈도우 시스템 사이의 인터페이스 이다. EGL은 그래픽스 컨텍스트 관리, 서피스/버퍼 바인딩, 렌더링 동기화 를 처리한다.
하지만 EGL을 처음 다루는 입장에서는 모르는 용어들이 많아서 EGL이 무엇인지 감이 잘 잡히지 않습니다.
네이티브 플랫폼 윈도우 시스템(Native Platform Window System)
그래픽스 컨텍스트(Graphics Context)
인터페이스(Interface)
서피스/버퍼(Surface/Buffer)
렌더링 동기화(Rendering Synchronization)
위에 제가 모르는 용어들을 모아 놓았습니다. 하나씩 의미를 알아본 뒤, EGL Reference Page의 설명을 다시 한번 알아보겠습니다.
네이티브 플랫폼 윈도우 시스템
그래픽스 컨텍스트
인터페이스
서피스/버퍼
렌더링 동기화
위의 용어 설명을 바탕으로 EGL Reference Page의 EGL 설명을 다시 하면
EGL은 크로노스 렌더링 API(OpenGL, OpenGL ES, OpenVG)와 아래 단에 존재하는 윈도우즈, 리눅스, 맥OS 등의 윈도우 시스템 사이의 정보를 주고 받는 역할을 한다. EGL은 그래픽스 컨텍스트를 사용하여 윈도우를 관리하고, 렌더링할 서피스와 그래픽스 컨텍스트를 연결하고, OpenGL 렌더링 파이프라인에서 렌더링 명령들이 완전히 실행되도록 한다.
위에서 간단하게 EGL에 대해서 알아보았습니다. 그렇다면 EGL을 왜 사용하는가에 대해 궁금해집니다. OpenGL로 그래픽스 프로그래밍을 하는데 EGL을 반드시 사용해야하는걸까요?
EGL 1.5 Specification을 보면 다음과 같은 문장이 있습니다.
EGL은 다양한 운영체제(안드로이드, 유닉스, 윈도우즈)와 플랫폼(X11, 윈도우즈와 같은 윈도우 시스템과 GBM과 같은 디스플레이 없이 렌더링을 지원하는 플랫폼) 상에서 구현할 수 있도록 만들어졌습니다. 또한 플랫폼의 특정 네이티브 렌더링 API를 통해 특정 타입의 EGL surface으로 렌더링을 허용할 수 있습니다.
가능한 범위 내에서, EGL 자체는 플랫폼 또는 렌더링 API와 관련된 정의 및 개념과 무관합니다.
OpenGL은 그래픽 연산을 위해 작성된 인터페이스 스펙일뿐입니다. 이 인터페이스가 어떻게 구현되는지는 OpenGL의 영역이 아닙니다. 따라서 모든 플랫폼들은 각기 다른 방식으로 OpenGL 컨텍스트를 구현합니다. 윈도우즈에서는 WGL을 사용하고, X-Windows에서는 GLX를 사용하고, OSX에서는 CGL을 사용합니다. EGL은 플랫폼 별 이러한 차이들을 추상화 해놓은 라이브러리입니다. 따라서 EGL을 사용하여 각 플랫폼 별 다른 방식으로 OpenGL 윈도우를 관리하지 않고 통합적으로 관리할 수 있는 장점이 있습니다. 물론 이런 목적의 라이브러리가 EGL있는 것은 아닙니다. GLUT, GLFW, SDL, SFML와 같은 비슷한 목적의 라이브러리도 존재합니다.