Software Development/Graphics

우분투 환경에서 SDL2 + GL 설정하고 빌드해보기

huiyu 2018. 1. 14. 12:48

OpenGL

컴퓨터 그래픽스를 화면에 나타낼때는 보통 그래픽 라이브러리 OpenGL이나 DirectX를 이용하게 되며,
이러한 라이브러리는 어플리케이션이 그 하부에서 동작하는 장치의 그래픽스 서브시스템에 접근하고 제어하기 위해 사용하는 인터페이스
OpenGL(Open Graphics Library) 는 실리콘 그래픽스사에서 만든 2차원/3차원 그래픽스 표준 API 규격으로, 프로그래밍 언어 간 플랫폼 간의 교차 프로그래밍을 지원

SDL(Simple Directmedia Layer)

SDL은 C로 짜여진 크로스플랫폼 멀티미디어 라이브러리입니다. 비디오,오디오,사용자 입력등을 추상화하여 API로 제공하며 리눅스, 윈도우, 안드로이드, iOS, 타이젠에서 사용가능하게 지원


1. OpenGL 설치 
 sudo apt-get install freeglut3-dev
-> /usr/include/GL 폴더 생성

2. SDL 설치
 sudo apt-get install libsdl2-dev
-> /usr/include/SDL2 폴더 생성

3. SDL+GL 기본 프레임워크

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <SDL.h>
#include <GL/gl.h>
 
int main()
{
        SDL_Window *win = NULL;
        SDL_GLContext context;
 
        SDL_Init(SDL_INIT_VIDEO);
        win = SDL_CreateWindow("window"20000480800, SDL_WINDOW_OPENGL);
 
        context = SDL_GL_CreateContext(win);
 
        SDL_bool isQuit = SDL_FALSE;
        while(!isQuit) {
                SDL_Event e;
                if(SDL_PollEvent(&e)) {
                        if(e.type == SDL_QUIT) {
                                isQuit = SDL_TRUE;
                        }
 
                }
                static const GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f};
                glClearBufferfv(GL_COLOR, 0, red);
                SDL_GL_SwapWindow(win);
        }
 
        SDL_Quit();
        return 0;
}
cs

- SDL_CreateWindow() : SDL을 이용한 윈도우 생성,
  *flag에 SDL_WINDOW_OPENGL을 넣어 opengl 사용 가능한 윈도우 생성

1
2
3
4
5
6
SDL_Window* SDL_CreateWindow(const char* title,
                             int         x,
                             int         y,
                             int         w,
                             int         h,
                             Uint32      flags)
cs


- SDL_GL_CreateContext() : GL사용을 위한 context 생성(내부적으로 eglContext와 eglMakeCurrent 수행)

1
SDL_GLContext SDL_GL_CreateContext(SDL_Window* window)
cs


 - SDL Main loop : SDL_PollEvent()를 통해 이벤트를 받으며, 종료 이벤트를 받기 전까지 메인루프 수행.
   메인 루프 내부에서 gl을 이용하여 화면을 그린다.

1
2
3
4
5
6
7
8
9
10
11
        while(!isQuit) {
                SDL_Event e;
                if(SDL_PollEvent(&e)) {
                        if(e.type == SDL_QUIT) {
                                isQuit = SDL_TRUE;
                        }
                }
                static const GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f};
                glClearBufferfv(GL_COLOR, 0, red);
                SDL_GL_SwapWindow(win);
        }
cs

 SDL_PollEvent() : SDL이벤트를 받는다.

1
int SDL_PollEvent(SDL_Event* event)
cs

 SDL_GL_SwapWindow() : GL을 이용하여 화면 업데이트 수행

1
void SDL_GL_SwapWindow(SDL_Window* window)
cs


4. gcc를 사용한 빌드

1
gcc opengl.c -o test -/usr/include/SDL2/ -/usr/include/GL/ -lSDL2 -lGL
cs

-I : 헤더 경로 선언, -l : 사용할 라이브러리 설정


5. 앱 실행 : ./test

아래와 같이 새빨간 샘플이 뜨게된다.


728x90