OpenGL ES 2.0 Application 에 필요한 라이브러리 : libGLESv2, libEGL
OpenGL ES 는 3D graphics 를 처리하는 OpenGL ES 함수들과 시스템 종속적인 부분을 처리하는 EGL 및 시스템 함수로 구성된다.
EGL : Native Platform Interface 로, 특정 플랫폼 시스템과 OpenGL ES API 사이의 glue interface layer 함수를 정의한다.
즉, 특정 윈도우 시스템과의 인터페이스를 제공하고, 디스플레이 연결을 위해 EGLDisplay 를 제공한다.
#include <EGL/egl.h>
#include <GLES2/gl2.h>
EGLDisplay eglDisplay = 0;
EGLConfig eglConfig = 0;
EGLSurface eglSurface = 0;
EGLContext eglContext = 0;
EGLNativeWindowType eglWindow = 0;
EGLConfig 는 EGL 에 의해 생성되는 평면에 대한 정보를 포함. 평면에 사용할 색의 구성과 수에 관련된 깊이 버퍼, 스텐실 버퍼, 평면 타입 등 정보 포함.
EGLSurface 는 eglCreateWindowSurface() 를 통해 만들지는 윈도우를 가리킨다.
EGLContext 는 연산을 위해 필요한 내용들을 포함하는 OpenGL ES 2.0 에 대한 데이터 문맥. 정점 데이터 배열이나 vertex 및 fragment shader 에 대한 참조를 포함할 수 있다.
EGLNativeWindowType 은 EGLSurface 와 함께 윈도우를 만들 때 사용되는 윈도우 핸들을 가리킨다.
Emulator 의 windowing 방식이 Windows API 를 따른다면 HWND 를 얻어와 eglWindow 에 연결한다.
hWnd = CreateWindow(WINDOW_CLASS, _T("Hello EGL"), WS_VISIBLE | WS_SYSMENU, 0, 0, nWidth, nHeight, NULL, NULL, hInstance, NULL);
eglWidow = hWnd;
hDC = GetDC(hWnd);
eglDisplay = eglGetDisplay(hDC); // eglDisplay 는 hDC 의Display 가 된다.
]
이제, EGLConfig 속성을 정한다.
const EGLint pi32ConfigAttribs[] =
{
EGL_LEVEL, 0,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NATIVE_RENDERABLE, EGL_FALSE,
EGL_DEPTH_SIZE, EGL_DONT_CARE,
EGL_NONE
};
Int iConfigs;
eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, &iConfigs);
pi32ConfigAttribs : 속성 list
- EGLConfig 의 속성들
. EGL_LEVEL : frame buffer level, default : 0
. EGL_SURFACE_TYPE : 지원되는 EGL 평면의 타입.
. EGL_RENDERABLE_TYPE : config 로 지원되는 렌더링 인터페이스.
. EGL_DEPTH_SIZE : depth buffer 의 비트수. EGL_DONT_CARE (-1) - 사용하지 않음.
eglChooseConfig
: pi32CofnigAttrib 의 속성과 일치하는 EGLConfig 를 선택한다.
maxReturnConfigs 는 1, numConig 를 iConfigs 변수로 확인한다. (예외처리에 사용)
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, eglWindow, NULL);
EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
eglCreateWindowSurface
: 윈도우 생성을 위한 함수. EGLSurface 형태의 윈도우를 반환. 반환값을 통해 에러 원인을 측정할 수 있다. 이 윈도우를 내부 렌더링 평면이라 함. 여기서 렌더링 평면 생성된 것이다.
마지막 NULL 인자는 속성 목록. 하지만 위의 Attribs 변수와는 다른 단일 값이 들어감. (EGL_RENDER_BUFFER), 보통 OpenVG 등 다른 렌더러와의 변행을 생각하여 전방 버퍼 및 후방 버퍼 등렌더링 버퍼를 지정하는데 사용된다. 현재는 기본값.
eglCreateContext
: 렌더링 문맥 EGLContext 를 생성할 때 사용. 역시 디스플레이 연결을 해야한다.
세번째 NULL 인자는 Shader Program 과 Texture Map 들과 같은 특정 데이터 타입을
공유하기 위한 shareContext 로 EGLContext type 이다.
마지막이 속성은 단일 값으로 EGL_CONTEXT_CLIENT_VERSION 1.x, 2.x등의 버전정보.
성공시, 렌더링 문맥 (EGLContext) 의 핸들을 반환한다.
또 반환값으로 에러코드를 볼 수도 있다.
이제, eglMakeCurrent 로 EGLContext 와 렌더링 평면 EGLSurface 를 연결한다.
EGL 은 여기까지. 윈도우의 생성과 문맥 형성 끝.
'EGL' 카테고리의 다른 글
OpenGLES-Samples (0) | 2019.04.16 |
---|---|
OpenGL ES EGL Spec&APIs (0) | 2019.04.16 |
Android EGL (0) | 2019.04.16 |