반응형



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

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



1. 프로젝트 생성


2. GLFW


3. GLEW


4. 프로젝트 설정


5. 테스트


6. OpenGL 버전 확인





본 포스팅을 따라 개발환경을 만든 후.. 다음 포스팅들도 검토해보세요.



Modern OpenGL 강좌 - GLFW와 GLEW 라이브러리 기본 사용방법

https://webnautes.tistory.com/1103


Modern OpenGL 강좌 - 삼각형 그리기( 렌더링, Vertex Array Object, Vertex Buffer Object)

https://webnautes.tistory.com/1153


Modern OpenGL 강좌 - 사각형 그리기(렌더링, Element Buffer Object)

https://webnautes.tistory.com/1106


Modern OpenGL 강좌 - 텍스처( texture ) 매핑하는 방법 ½

https://webnautes.tistory.com/1160





1.  빈 프로젝트 생성

1. Visual Studio 2017을 실행시키고 메뉴에서 파일 > 새로 만들기 > 프로젝트를 선택합니다.

Windows 데스크톱 마법사를 선택하고  프로젝트 이름을 지정해 줍니다.




빈 프로젝트를 체크하고 SDL을 체크해제합니다.




2. 왼쪽 솔루션 탐색기에서 소스 파일 항목을 선택한 후 마우스 오른쪽 버튼을 눌러 나오는 메뉴에서 추가 > 새 항목을 선택합니다.





3. 새 항목 추가 이 뜨면 C++ 파일(.cpp)를 선택하고 이름을 적당히 수정한 후 추가 버튼을 클릭합니다.





4. 메뉴 아래에 보이는 솔루션 플랫폼 x64로 변경합니다.





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


프로젝트 이름 OpenGL Example이고 프로젝트 위치  C:\Users\사용자이름\Documents\Visual Studio 2017\Projects\OpenGL Example인 경우로 가정하고 설명합니다.


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




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 C++ 2017(Visual Studio 2017)에 대한 언급이 없지만 문제없이 동작가능합니다.





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





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





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





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





lib 폴더안에 glfw3.dll 파일이 포함되어 있습니다.

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

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




3. GLEW(OpenGL Extension Wrangler)

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

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


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

http://glew.sourceforge.net/


다운로드에 문제가 있는 경우 아래 링크에서 다운로드 받으세요.

https://github.com/nigels-com/glew/releases/download/glew-2.1.0/glew-2.1.0-win32.zip



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





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




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

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





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





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





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





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

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




4. 테스트

아래 경로에 있는 코드에 Visual Studio에서 컴파일하기 위해 필요한 코드를 추가하여 테스트를 진행했습니다.



아래 코드를 프로젝트의 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 버전 확인하기

http://webnautes.tistory.com/1114



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


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




제가 사용하는 노트북에서는 OpenGL 3.0 ~ 4.4 까지만 100 %지원합니다.

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




참고로 OpenGL 4.5 이후로는 벌컨(Vulkan - Next Generation OpenGL Initiative)으로 대체될 예정입니다.



마지막 업데이트 2017. 10. 5.

반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


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

  1. 세계시민 2017.01.18 11:54

    한참 초보자가 질문드립니다...
    빌드 시 Release x64로 하는데 이러면 64비트용으로만 빌드가 되는 건가요?

    64비트용으로 되면 32비트로는 어떻게 설정해야 하는지 알려주시면 안될까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.01.18 12:01 신고

      솔루션 플랫폼을 x86으로 하시고.
      glfw의 경우에는 32비트용 라이브러리를 다운받고.. 그 외에는 x86폴더에서 라이브러리를 가져오면 됩니다.. 설정방법은 x64용으로 기술한 내용을 따라해보시면 될듯합니다.

  2. 세계시민 2017.01.18 17:01

    실행된는 것 확인하였습니다...
    도움 주셔서 감사합니다...

  3. 컴파일시 2017.09.08 21:38

    질문드립니다
    1. 컴파일시 에러메세지 " glew32.dll이(가) 없어 코드 실행을 진행 할 수 없습니다. 프로그램을 다시 설치하면 이 문제가 해결될 수 있습니다." 가 뜹니다. 프로젝트 dll폴더에 glew32.dll 파일이 분명 있는데 왜 그럴까요...
    2. opengl32.dll , OpenGL32.Lib 이 컴퓨터에 설치되어있는것을 확인했습니다. 별도의 경로에 복사 붙여넣기 해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.09.10 14:54 신고

      1번 문제는 아래부분을 확인해보세요.

      속성 페이지 창에서 구성 속성 > 디버깅을 선택하고 환경 항목에  DLL 파일 위치를 다음처럼 입력합니다.

      붉은색 부분은 실제 프로젝트 폴더 위치에 맞추어 변경하세요.

      PATH=C:\Users\note\Documents\Visual Studio 2017\Projects\OpenGL Example\OpenGL Example\dll;%PATH

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.09.10 14:56 신고

      2번은 아래 한줄로 해결됩니다.

      #pragma comment(lib, "OpenGL32.lib")

  4. 궁금 2017.11.07 15:48

    감사합니다. 잘 읽어보았습니다. 그런데 궁금한게 있어 질문드립니다.

    ========================================================================
    "주의할 점은 OpenGL32.lib와 opengl32.dll를 프로젝트 폴더에 포함시키지 않도록 해야 합니다.
    컴퓨터에 설치된 파일들을 사용하는게 좋습니다."
    ========================================================================

    프로젝트 폴더에 포함시켰을 때 어떤 문제가 발생하나요?

  5. LEE 2018.03.24 14:35

    GL/glew.h 를 include가 안되는데 왜일까요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.03.25 16:05 신고

      프로젝트 설정에서 추가포함 디렉토리 설정이 잘못된게 아닐까 싶습니다

  6. 꼭 답변해주세요 2018.10.07 18:45

    하라는 대로 실행하고 컴파일을 시켰는데 2017 버전에서는 코드 c1075 오류가 뜹니다
    일치하는 토큰을 찾을수 없다는데 해결할 방법이 있나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.10.07 19:23 신고

      찾아보니 괄호가 짝을 이루지 않아서 발생하는 에러라는 군요..

      https://docs.microsoft.com/ko-kr/cpp/error-messages/compiler-errors-1/fatal-error-c1075?view=vs-2017

      혹시 코드는 포스팅에 있는 것을 복사해서 그대로 사용했나요?

  7. Favicon of https://broc.tistory.com BlogIcon 여미네파랑새 2019.02.12 00:58 신고

    우선 포스팅 잘 봤습니다.

    답변 꼭 부탁드립니다 이 문제 때문에 몇달간 구글링을 해보고 있지만 별 성과가 없네요ㅠㅠ
    그대로 따라하니까

    코드 LNK2001 오류가 17개나 나옵니다.
    죄다 첫번째 줄에서 오류가 있다고 하고,
    _glfwWindowShouldClose 외부 기호를 확인할 수 없습니다. 라는 설명처럼
    어떤 외부 기호를 확인할 수 없다는 설명이 쭉 나옵니다.
    어떻게 해결하면 좋을까요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.02.12 10:02 신고

      포스팅을 수정했습니다. 확인해보세요.

    • Favicon of https://broc.tistory.com BlogIcon 여미네파랑새 2019.02.12 12:49 신고

      드디어 제대로 실행이 되네요ㅠㅠ 정말 고맙습니다!! 덕분에 몇달만에 처음으로 창 띄워보네요ㅠㅠ

  8. 2019.03.05 14:49

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.05 16:03 신고

      지금 소스포지가 문제가 있나보네요.
      아래 링크에서 다운로드 받으세요.

      https://github.com/nigels-com/glew/releases/download/glew-2.1.0/glew-2.1.0-win32.zip

  9. 끼야야야ㅑㅑㄱ 2019.03.18 13:15

    설정에 도움주셔서 감사합니다 :)
    혹시 윈도우에서 비주얼 스튜디오를 사용하지 않을 때 설정 방법도 있을까요?
    그리고 비주얼 스튜디오에서 프로젝트를 새로 생성할 때마다 이 설정을 매번 해줘야 하는 건가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.18 14:16 신고

      사용하는 라이브러리 들이 비쥬얼스튜디오 용이라 어쩔수 없이 비쥬얼 스튜디오를 사용해야 합니다. MINGW를 사용하는 방법도 있을 듯하지만 어차피 프로그래밍을 편하게 하려면 비쥬얼 스튜디오 같은 IDE가 필요합니다.

      설정은 매번 해줄 수 밖에 없습니다.
      프로젝트를 한번 생성해서 복사해서 사용하면 어떨가 싶습니다.

  10. 3D공부중.... 2019.03.20 11:12

    잘 보고 배우고 갑니다 ^^

  11. 컴과돌이 2019.09.15 15:01

    혼자 환경설정하기 어려웠는데 많은 도움이 됐어요 감사합니다~

  12. Favicon of https://codingfarm.tistory.com BlogIcon scarecrow1992 2020.03.20 16:01 신고

    정말 감사합니다.

+ Recent posts