안녕하세요 여러분
이번 포스팅에서는 GLFW, GLEW, GLM을 사용하는
OpenGL 프로젝트를 세팅하는 법에 대해 설명하려고 합니다.
먼저 각 라이브러리에대해 설명을 간단하게 하려고 합니다.
GLFW란?
OpenGL은 실제 구현된 라이브러리가 아닌, 그래픽 API 스펙입니다. 라이브러리를 구현할 때 플랫폼에 따른 종속성을 배제하기 위해서 UI와 컨텍스트를 위한 API는 제외하고 구현하였는데요, GLUT, GLFW 등은 이러한 점을 해결하기 위해 사용되는 라이브러리 입니다. 윈도우 창을 생성하거나, 키보드 마우스 입력, 다양한 이벤트 콜백 함수들을 사용하기 위해서 GLFW를 사용합니다. 본 포스팅에서 사용하는 GLFW는 아래 링크에서 다운로드 받을 수 있습니다.
GLEW란?
OpenGL Extension Wrangler Library의 준말로 OpenGL의 확장 라이브러리 입니다.
OpenGL의새로운 기능을 제공하는 하나의 헤더파일로, 기본적으로 제공하지 않는
다양한 기능들을 제공하고 있습니다. 모든 환경에서 잘 작동한다고 보장하진 않지만
유용한 기능들을 제공하고있어, 쉐이더 프로그램을 작성할 때 주로 사용합니다. 본 포스팅에서 사용하는 GLEW는 아래 링크에서 다운로드 받을 수 있습니다.
GLM이란?
OpenGL Mathematics의 약자로, GLSL을 기반으로하는 그래픽 소프트웨어에 사용 가능한 C++ 수학 라이브러리 입니다. 해당 라이브러리는 다양한 수학 함수들을 내포하고 있으며, GLSL과 기능적 문법적 내용이 유사하여 쉽게 사용할 수 있습니다.
본 포스팅에서 사용하는 GLM은 아래 링크에서 다운로드 받을 수 있습니다.
본 포스팅은 비쥬얼 스튜디오 2013을 기준으로
작성하였습니다!
가장 먼저 헤더파일과 라이브러리파일을 윈도우 경로에 옮겨주도록 하겠습니다.
압축을 풀면 다음과 같은 내용물들이 보일껍니다!
<GLFW 압축 해제 결과>
<GLEW 압축 해제 결과>
1. 헤더파일 옮기기
헤더파일은 윈도우 10 기준으로
C:\Program Files (x86)\Windows Kits\8.1\Include\um
경로가 기본으로 사용됩니다.
해당 경로에 다음 6개의 파일을 옮겨줄 예정입니다.
GLFW 헤더파일은 GLFW 폴더를 생성해서 복사하였고,
GLEW 헤더파일은 GL 폴더에 복사하였습니다!
<GLFW 헤더파일>
<GLEW 헤더파일>
GLFW, GLM 파일들은 폴더를 통으로 해당 경로에 옮겨주면 됩니다!
<헤더 파일 복사 결과 : gl 폴더>
<헤더 파일 복사 결과 : GLFW 폴더, GLM폴더>
2. 라이브러리파일 옮기기
라이브러리파일은 윈도우 10 기준으로
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86
경로가 기본으로 사용됩니다.
GLEW는 lib\Release\Win32 폴더에 있는 다음 라이브러리를 해당 경로로 복사하며
GLFW는 사용중인 컴파일러 버전에 맞춰 라이브러리를 해당 경로로 복사합니다!
<라이브러리 파일>
3. DLL파일 옮기기
DLL파일은 윈도우 10 기준으로
C:\Windows\System32
경로가 기본으로 사용됩니다.
<DLL 파일 옮기기 결과>
3-1. DLL파일 옮기기(중요)
4. 프로젝트 설정하기
이제 프로젝트를 생성해서 제대로 작동하는지 확인해볼 필요가 있습니다!
빈 프로젝트로 생성한 이후 프로젝트 설정으로 들어가보겠습니다.
Configuration Properties -> Linker -> Input 메뉴에서 추가한 라이브러리 파일들을
프로젝트에 추가하는 작업이 필요합니다.
해당 창에서 Additional Dependencies를 선택하고, 다음과 같이 입력합니다.
이후 다음 코드를 기입해서 테스트를 진행해보세요!!
#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/gl.h>
#include <GLFW/glfw3.h>
const char* gameTitle = "TEST";
GLFWwindow* window;
GLfloat vertices[] =
{
-1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1,
1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,
-1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1
};
GLfloat colors[] =
{
0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,
1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1
};
static void controls(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (action == GLFW_PRESS)
if (key == GLFW_KEY_ESCAPE)
glfwSetWindowShouldClose(window, GL_TRUE);
}
bool initWindow(const int resX, const int resY)
{
if (!glfwInit())
{
fprintf(stderr, "Failed to initialize GLFW\n");
return false;
}
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
// Open a window and create its OpenGL context
window = glfwCreateWindow(resX, resY, gameTitle, NULL, NULL);
if (window == NULL)
{
fprintf(stderr, "Failed to open GLFW window.\n");
glfwTerminate();
return false;
}
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, controls);
// Get info of GPU and supported OpenGL version
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("OpenGL version supported %s\n", glGetString(GL_VERSION));
glEnable(GL_DEPTH_TEST); // Depth Testing
glDepthFunc(GL_LEQUAL);
glDisable(GL_CULL_FACE);
glCullFace(GL_BACK);
return true;
}
static void drawCube()
{
static float alpha = 0;
glMatrixMode(GL_PROJECTION_MATRIX);
glLoadIdentity();
glTranslatef(0, 0, -2);
glMatrixMode(GL_MODELVIEW_MATRIX);
/* We have a color array and a vertex array */
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
/* Send data : 24 vertices */
glDrawArrays(GL_QUADS, 0, 24);
/* Cleanup states */
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
alpha += 0.1;
}
static void display()
{
glClearColor(0.0, 0.8, 0.3, 1.0);
while (!glfwWindowShouldClose(window))
{
// Draw stuff
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawCube();
// Update Screen
//glFlush();
glfwSwapBuffers(window);
// Check for any input, or window movement
glfwPollEvents();
// Scale to window size
GLint windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
glViewport(0, 0, windowWidth, windowHeight);
}
}
int main(int argc, char** argv)
{
if (initWindow(1024, 620))
{
display();
}
printf("Goodbye!\n");
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
프로젝트 설정이 완료되면 다음과 같은 결과를 얻을 수 있습니다!!
오늘 포스팅은 여기까지입니다.
다음 포스팅에서는 GLFW와 GLEW에 더불어
쉐이더를 사용해 도형을 그려보는 내용을 다뤄볼 예정입니다.
감사합니다.
'개발 > OpenGL' 카테고리의 다른 글
프레임 버퍼 이미지 파일로 저장하기 (0) | 2019.10.16 |
---|---|
OpenGL 애니메이션 처리하기(더블 버퍼링) (0) | 2016.12.13 |
OpenGL 점,선 그리기 (1) | 2016.01.14 |
OpenGL 1.0 시작하기 (0) | 2015.12.30 |