EGL이 어떤 것인지 알아보았으므로 이번에는 EGL을 사용하여 OpenGL ES을 실행해 보겠습니다.
eglGetDisplay
를 호출합니다.
EGLDisplay eglGetDisplay(NativeDisplayType native_display);
eglGetPlatformDisplay
또는 eglGetDisplay
는 EGL display connection 을 반환합니다.eglInitialize
를 호출합니다.
EGLBoolean eglInitialize(EGLDisplay display,
EGLint *major,
EGLint *minor);
eglInitialize
는 EGL display connection 을 초기화하고 지원하는 EGL의 버전을 반환합니다.eglBindAPI
를 호출합니다.
EGLBoolean eglBindAPI(EGLenum api);
eglChooseConfig
를 호출합니다.
EGLBoolean eglChooseConfig(EGLDisplay display,
EGLint const *attrib_list,
EGLConfig *configs,
EGLint config_size,
EGLint *num_config);
eglChooseConfig
는 파라미터 attrib_list 에 설정한 속성과 일치하는 EGLConfig 를 파라미터 configs 로 반환합니다.eglCreateContext
를 호출합니다.
EGLContext eglCreateContext(EGLDisplay display,
EGLConfig config,
EGLContext share_context,
EGLint const *attrib_list);
eglCreateContext
를 호출하여 EGL rendering context 를 생성합니다.네이티브 윈도우를 생성합니다.
eglCreateWindowSurface
를 호출합니다.
EGLSurface eglCreateWindowSurface(EGLDisplay display,
EGLConfig config,
NativeWindowType native_window,
EGLint const *attrib_list);
eglCreateWindowSurface
는 EGLSurface 를 반환합니다.eglMakeCurrent
를 호출합니다.
EGLBoolean eglMakeCurrent(EGLDisplay display,
EGLSurface draw,
EGLSurface read,
EGLContext context);
eglMakeCurrent
를 호출하여 현재 사용할 EGL rendering context 와 EGL surface 를 연결합니다.eglMakeCurrent
를 호출하여 연결된 context와 surface는 이후에 다른 eglMakeCurrent
가 호출되기 전까지 연결이 유지됩니다.eglSwapBuffers
를 호출합니다.
EGLBoolean eglSwapBuffers(EGLDisplay display,
EGLSurface surface);
eglSwapBuffers
를 호출하여 렌더링된 결과를 디스플레이에 표시할 수 있습니다.eglSwapBuffers
는 아무런 영향을 미치지 못합니다.#include <stdlib.h>
#include <unistd.h>
#include <EGL/egl.h>
#include <GLES/gl.h>
extern NativeWindowType createNativeWindow(void);
static EGLint const attribute_list[] = {
EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1,
EGL_NONE
};
int main(int argc, char **argv) {
EGLDisplay display;
EGLConfig config;
EGLContext context;
EGLSurface surface;
NativeWindowType native_window;
EGLint num_config;
/* 1. EGL display connection 을 얻습니다. */
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
/* 2. EGL display connection 을 초기화합니다. */
eglInitialize(display, NULL, NULL);
/* 3. 사용할 rendering API를 설정합니다. */
eglBindAPI(EGL_OPENGL_ES_API);
/* 4. EGL frame buffer configuration을 얻습니다. */
eglChooseConfig(display, attribute_list, &config, 1, &num_config);
/* 5. EGL rendering context를 생성합니다. */
context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);
/* 6. native window를 생성합니다. */
native_window = createNativeWindow();
/* 7. EGL window surface를 생성합니다. */
surface = eglCreateWindowSurface(display, config, native_window, NULL);
/* 8. surface와 context를 연결합니다. */
eglMakeCurrent(display, surface, surface, context);
/* color buffer를 clear합니다. */
glClearColor(1.0, 1.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
/* 9. back buffer와 front buffer를 스왑하여 화면에 보여줍니다. */
eglSwapBuffers(display, surface);
sleep(10);
return EXIT_SUCCESS;
}