VS2013에서 SDL2와 SDL_Image, openGL을 사용하기 위해
개발환경을 설정하는 단계를 포스팅해봅니다.
1 .SDL 홈페이지(https://www.libsdl.org)에서 SDL2 다운로드 페이지로 들어간다.
2. Windows용Development Libraries zip 파일을 다운받아서 압축을 푼다
3. 비주얼스튜디오를 열고 win32 콘솔 프로그램 프로젝트를 만든다.
4. 프로젝트 속성 창을 열고 Configuration Properties의 VC++ Directories로 들어간다.
5. Include Directories 항목에는 SDL2의 헤더파일(.h)이 있는 폴더를 지정하고,
Library Directories 항목에는 SDL2의 lib파일이 있는 폴더를 지정한다.
여기서 32비트와 64비트가 있는데 32비트로 진행하였다.
6. 이제 링커 설정에서 라이브러리 의존성을 지정해야 한다.
5번과 같은 속성창에서 Linker - Input - Additional Dependencies에
라이브러리 파일의 이름을 추가해도 되지만 여기서는 소스코드에 직접 넣었다.
1 2 3 4 5 6 7 8 9 | #pragma comment (lib,"SDL2") #pragma comment (lib,"SDL2main") #include <SDL.h> |
소스코드의 윗부분에 #pragma comment로 lib파일을 쓰면 된다.
SDL2.lib과 SDL2main.lib을 추가한다.
경우에 따라 라이브러리파일의 이름이 SDL2.lib이 아니라 SDL.lib일 수도 있으니 주의.
7. 이제 SDL의 이미지파일 처리 등을 도와주는 SDL_Image 라이브러리를 설치한다.
https://www.libsdl.org/projects/SDL_image/에서
2번과 같이 Development Libraries zip파일을 받는다.
5번에서처럼 Include Directories와 Library Directories를 각각 추가한다.
*다른 SDL 관련 추가 라이브러리도 이와 같은 방법으로 추가하면 된다.
8. 사용할 라이브러리와 헤더파일들을 소스코드에 명시한다.
opengl함수들을 직접 사용하기 위해서는 opengl32.lib 파일을 링크해야 한다.
1 2 3 4 5 6 7 8 9 | #pragma comment (lib,"SDL2") #pragma comment (lib,"SDL2main") #pragma comment (lib,"SDL2_image") #pragma comment (lib,"opengl32.lib") #include <SDL.h> #include <SDL_opengl.h> #include <SDL_image.h> | cs |
※ 실행시 SDL.dll을 찾을 수 없다는 오류가 난다면
다운받은 라이브러리 폴더에 있는 SDL2.dll과 SDL2_image.dll을 복사하여
프로젝트 폴더 내의 Debug 혹은 Release폴더에 넣는다.
아래는 간단하게 작성해본 테스트용 코드..
프로젝트 디렉토리에 res 라는 폴더가 있고
그 폴더에 있는 img.png 파일(512x512)을 로드하여 화면에 표시한다.
(SDL의 함수들만 사용해도 이미지를 띄울 수 있지만
opengl함수들을 사용해보기 위해 아래와 같이 작성하였습니다.)
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #pragma comment (lib,"SDL2") #pragma comment (lib,"SDL2main") #pragma comment (lib,"SDL2_image") #pragma comment (lib,"opengl32.lib") #include <cstdio> #include <SDL.h> #include <SDL_opengl.h> #include <SDL_image.h> using namespace std; int main(int argc, char **argv){ SDL_Window *win = NULL; SDL_Surface *image; SDL_RWops *rwop; rwop = SDL_RWFromFile("../res/img.png", "rb"); image = IMG_LoadPNG_RW(rwop); GLubyte *map = (GLubyte*)image->pixels; //Initialize SDL. if (SDL_Init(SDL_INIT_VIDEO) < 0) return 1; //Create the window win = SDL_CreateWindow("SDL_GL", 100, 100, 400, 300, SDL_WINDOW_OPENGL); SDL_GLContext context; context = SDL_GL_CreateContext(win); glEnable(GL_TEXTURE_2D); GLuint texId; glGenTextures(1, &texId); glBindTexture(GL_TEXTURE_2D, texId); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, map ); // Texture filter glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // main loop while (1) { //event handling SDL_Event e; if (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) break; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, texId); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2f(-0.7, 1.0); glTexCoord2f(1.0, 0.0); glVertex2f(0.7, 1.0); glTexCoord2f(1.0, 1.0); glVertex2f(0.7, -1.0); glTexCoord2f(0.0, 1.0); glVertex2f(-0.7, -1.0); glEnd(); SDL_GL_SwapWindow(win); SDL_Delay(16); } SDL_GL_DeleteContext(context); SDL_DestroyWindow(win); SDL_Quit(); return 0; } | cs |
실행결과
자세한 코드 내용은 다음 포스트에 계속돱니다