반응형

Visual Studio Community 2022에서 GLFW 라이브러리를 사용하여 OpenGL 개발을 시작하기 위해 필요한 설정 방법을 다룹니다. 

다른 Visual Studio 버전에서도 거의 동일하게 설정 가능합니다.




1. 프로젝트 생성

2. GLFW

3. GLEW

4. 프로젝트 설정

5. 테스트

6. OpenGL 버전 확인




2017. 1. 7   - 최초작성

2021. 9. 26 - Visual Studio 2019로 변경.  

2023. 7. 23 - Visual Studio 2023으로 변경.



1.  프로젝트 생성

1. “Create a new project”를 클릭합니다. 

 

2. “Windows Desktop Wizard”를 선택하고 Next를 클릭합니다. 

 

“Project name”을 적어주고 Create를 클릭합니다. 

 

 

3. “Application type”로 “Console Application”이 선택된 상태에서 “Empty project를 체크하고 OK를 클릭합니다.

 

4. Solution Explorer의 Source Files에서  마우스 우클릭하면 보이는 메뉴에서 Add > New Item을 선택합니다. 

 

5. main.cpp 라고 소스 코드 파일이름을 적어준후  Add를 클릭합니다.

 

 

Source Files항목에 cpp 파일이 추가되면서 해당 파일이 열립니다. 

 

6. 툴바의 솔루션 플랫폼을  x64인지 확인합니다.




이제부터 Visual Studio 2022에서 OpenGL 개발을 하기위해 필요한 라이브러리를 프로젝트에 추가하는 방법을 설명합니다. 

 

프로젝트 이름 OpenGL Project이고 프로젝트 위치  C:\Users\사용자이름\source\repos\OpenGL Project인 경우로 가정하고 설명합니다. 

 

사용하시는 환경에 맞추어 적절히 변경하시면 됩니다. 




2. GLFW

OpenGL은 실제 구현된 라이브러리가 아니라 API 스펙입니다. 

라이브러리 구현시 플랫폼 종속성을 배제하기 위해서 UI 및 OpenGL 컨텍스트(context) 등을 위한 API는 빠져있습니다.

그래서 보통 플랫폼별로 지원되는 방식을 사용하여 UI를 만들어 사용합니다.

 

본 포스팅에서는 플랫폼에 독립적인 코드를 작성하기 위해서 GLFW 라이브러리를 사용했습니다.

OpenGL 렌더링 결과를 보여주기 위해 필요한 윈도우(UI)와 OpenGL 컨텍스트 생성 그리고 사용자와 상호 작용을 위해 필요한 키보드/마우스 입력, 이벤트 다루기 등을 위해 사용됩니다.

대부분의 플랫폼에서 똑같은 코드로 동작시키기 위해서 사용하지만  실제로는 일부 수정이 필요하기도 합니다. 

 

GLFW 외에도 선택가능한 플랫폼 독립적인 라이브러리로는 SFML, SDL,  freeglut 등이 있습니다.

장단점이 각각 있기 때문에 어느것이 가장 좋다고는 말하기 힘듭니다. 



GLFW는 아래 링크에서 다운로드 가능합니다. 

http://www.glfw.org/download.html




64비트 윈도우에서 Visual Studio를 사용할 경우를 위해 미리 컴파일된 64-bit Windows binaries를 다운로드 받습니다.

Visual Studio 2010 ~ 2019와 Visual Studio 2022 preview를 지원한다고 되어 있습니다. 




압축을 풀은 후, include 폴더를 복사(Ctrl+C)하여 

 




프로젝트 폴더의 경로  OpenGL Project\OpenGL Project에 붙여넣기(Ctrl+V)해줍니다.

 




압축을 풀은 폴더에서 lib-vc2022 폴더를 복사하여

 




프로젝트 폴더의 경로  OpenGL Project\OpenGL Project붙여넣기해주고 폴더 이름 lib로 수정합니다. 

 




현재 위치에 있는 lib 폴더안에 glfw3.dll 파일이 포함되어 있습니다. 

GLFW 라이브러리를 사용하여 컴파일한 실행 파일과 같이 배포해야 하는 파일입니다. 

컴파일 중에는 프로젝트 폴더의 경로  OpenGL Project\OpenGL Project에 두어도 됩니다. 

 




3. GLEW(OpenGL Extension Wrangler)

OpenGL 3.x 이상에서는 호출 가능한 OpenGL API 함수들이 런타임에 결정됩니다. 

GLEW를 사용하여 런타임에 OpenGL API 함수를 호출합니다.  

 

아래 링크에서 GLEW를 다운로드 받을 수  있습니다.

http://glew.sourceforge.net/ 




Windows 32-bit and 64-bit를 클릭하여 미리 라이브러리를  컴파일해둔 바이너리를 다운로드 받습니다.

 




압축을 풀은 후, include 폴더를 복사하여 

(압축 해제 프로그램에 따라 glew-2.1.0-win32 폴더가 상위 폴더 일 수도 있습니다.)

 




프로젝트 폴더의 경로  OpenGL Project\OpenGL Project붙여넣기해줍니다. 

기존에 생성된 include 폴더에 추가로 복사되어 집니다. 





압축을 풀은 폴더의 경로 glew-2.1.0\lib\Release\x64에 있는  glew32.lib, glew32s.lib를 복사하여

(압축 해제 프로그램에 따라 glew-2.1.0-win32 폴더가 상위 폴더 일 수도 있습니다.)

 




프로젝트 폴더의 경로 OpenGL Project\OpenGL Project\lib에 붙여넣기 해줍니다. 

 




압축을 풀은 폴더의 경로 glew-2.1.0\bin\Release\x64에 있는  glew32.dll 파일을  복사합니다.

(압축 해제 프로그램에 따라 glew-2.1.0-win32 폴더가 상위 폴더 일 수도 있습니다.)

 




GLEW 라이브러리를 사용하여 컴파일한 실행 파일과 같이 배포해야 하는 파일입니다. 

컴파일 중에는 프로젝트 폴더의 경로  OpenGL Project\OpenGL Project에 두어도 됩니다.

 



4. 테스트

 

아래 코드를 프로젝트의 cpp 파일에 복사해서 테스트를 진행했습니다.

 

#include "include/GL/glew.h"
#include "include/GLFW/glfw3.h"
#include <iostream>

#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "lib/glew32.lib")
#pragma comment(lib, "lib/glfw3.lib")



void window_resized(GLFWwindow* window, int width, int height);

void key_pressed(GLFWwindow* window, int key, int scancode, int action, int mods);
void show_glfw_error(int error, const char* description);


int main()
{
glfwSetErrorCallback(show_glfw_error);


if (!glfwInit()) {
std::cerr << "GLFW 초기화 실패" << '\n';
exit(-1);
}


glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);


GLFWwindow* window = glfwCreateWindow(
800, // width
600, // height
"OpenGL Example",

NULL, NULL);
if (!window)
{
std::cerr << "윈도우 생성 실패" << '\n';
glfwTerminate();
exit(-1);
}


glfwMakeContextCurrent(window);


glfwSetWindowSizeCallback(window, window_resized);
glfwSetKeyCallback(window, key_pressed);


glfwSwapInterval(1);


glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (err != GLEW_OK) {
std::cerr << "GLEW 초기화 실패 " << glewGetErrorString(err) << '\n';
glfwTerminate();
exit(-1);
}


std::cout << glGetString(GL_VERSION) << '\n';


int nr_extensions = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &nr_extensions);

for (int i = 0; i < nr_extensions; ++i) {
std::cout << glGetStringi(GL_EXTENSIONS, i) << '\n';
}


glClearColor(0, 0, 1, 1);


while (!glfwWindowShouldClose(window)) {

glClear(GL_COLOR_BUFFER_BIT);

glfwSwapBuffers(window);

glfwPollEvents();
}


glfwDestroyWindow(window);


glfwTerminate();
return 0;
}

void show_glfw_error(int error, const char* description) {
std::cerr << "Error: " << description << '\n';
}

void window_resized(GLFWwindow* window, int width, int height) {
std::cout << "Window resized, new window size: " << width << " x " << height << '\n';

glClearColor(0, 0, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
}

void key_pressed(GLFWwindow* window, int key, int scancode, int action, int mods) {
if (key == 'Q' && action == GLFW_PRESS) {
glfwTerminate();
exit(0);
}
}



Ctrl + F5를 눌러서 컴파일 및 실행을 합니다. 문제 없으면 아래처럼 두 개의 창이 보여집니다.

명령 프롬프트 창에 사용중인 OpenGL 버전과 사용 가능한 OpenGL extension을 보여줍니다.

OpenGL를 위해 GLFW를 사용하여 생성한  창을 파란색으로 채워서 보여줍니다.

 




5. OpenGL 버전 확인

현재 윈도우에 설치된 그래픽 드라이버에서 지원하는 OpenGL 버전 확인을 위해 다음 링크를 읽어보세요.

 

Windows 환경에서 그래픽 드라이버가 지원하는 OpenGL 버전 확인하기

https://webnautes.blog/3321/ 



그래픽 드라이버에서 지원하는 OpenGL 버전이 중요한 이유는 최근에 나온 버전인 윈도우 10에도 OpenGL 1.1을 구현해놓은 라이브러리만 포함되어 있기 때문에 상위 OpenGL 버전에 대한 구현은 그래픽 드라이버에 포함되어 나오기 때문입니다. 

 

그래픽 드라이버를 만드는 CPU 또는 그래픽카드 제조사에서 상위 OpenGL 버전의 스펙을 구현하기 위해 opengl32.dll을 수정할 수 없는 상황이라서 extension 메커니즘을 사용하여 해결합니다.




예전에 테스트해본 결과입니다.  이  노트북에서는 OpenGL 3.0 ~ 4.4 까지만 100 %지원합니다.

100% 라고 하는 의미는 해당 버전 OpenGL 스펙에 기술된 API를 그래픽 드라이버에서 모두 구현했다는 겁니다.  

 




반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts