외부 라이브러리(imgui)까지 세팅한 이 글의 최종 예제
Windows 10, Visual Studio 2017에서
GLFW를 사용해 OpenGL 프로젝트 세팅하기
윈도우 환경에서 C++로 OpenGL을 실습하려면 Visual Studio 2017 (이하 VS2017)를 설정해야한다. 하지만 이 세팅하고 설치하는 방법이 쉽지않다.
그래서 Vcpkg를 통해서 설치하는 방법과 CMake로 직접 빌드하는 방법을 소개하고 외부 라이브러리를 추가로 사용하는 방법을 소개하기 위해 dear imgui를 사용하는 예제까지 정리해둔다.
해당 블로그 글의 예제는 아래 GitHub 저장소에서 받아쓸 수 있다.
0. GLFW
GLFW(http://www.glfw.org/)는 OpenGL을 데스크탑에서 쉽게 사용할 수 있도록 해주며 멀티 플랫폼을 지원하는 라이브러리이다. 주로 창(Window)과 입력(I/O) 구현을 보조해준다.
비슷한 역할을 하는 라이브러리로 GLUT(https://www.opengl.org/resources/libraries/glut/)이 있다. 사족이지만 GLUT을 사용할 경우도 이 글에서 설명한 것과 동일한 방법으로 설치할 수 있다.
비슷한 역할을 하는 라이브러리로 GLUT(https://www.opengl.org/resources/libraries/glut/)이 있다. 사족이지만 GLUT을 사용할 경우도 이 글에서 설명한 것과 동일한 방법으로 설치할 수 있다.
본 글에서는 GLFW를 세팅한 후 quick이라고 불리는 코드가 실행될 수 있도록 확인 과정까지 거친다. quick을 실행해봄으로써 설치가 제대로 이뤄졌는지 확인할 수 있다.
quick은 2가지 버전이 있는데 3.0과 latest이다.
3.0(old) : http://www.glfw.org/docs/3.0/quick.html
두 버전의 차이는 OpenGL의 old vs modern으로 요약할 수 있는데 간단히 정리하면 OpenGL 버전이 올라가면서 오래된 함수를 더이상 지원하지 않는다 정도로 이해해두자.
1. Vcpkg를 사용하는 방법
Vcpkg만 설치하면 복잡한 프로젝트 설정, 라이브러리 설치과정 없이 #include <stdio.h>하듯 바로 GLFW를 사용할 수 있다. 과정이 복잡해보이지만 2018년 1월 기준으로 처음 세팅하기에 이보다 편리하고 의존성 낮은 방법은 없다고 단언한다.
Vcpkg(https://github.com/Microsoft/vcpkg)는 마이크로소프트가 공식으로 지원하는 C/C++ 라이브러리의 패키지매니저이다. 이름부터 VC + pkg(Package)이다.
이 글에서는 GLFW를 설치하면서 Vcpkg를 사용할 때 주의해야하는 점과 Vcpkg의 동작 원리를 주로 살펴본다.
Vcpkg를 설치하는 방법
1. https://github.com/Microsoft/vcpkg에서 Vcpkg 다운로드
2. C:\ 경로에 압축을 풀거나 Git을 저장한다.
3. 이후 아래 과정을 따라간다. 윈도우 콘솔 창을 사용한다.
bootstrap-vcpkg.bat을 실행한다. 여기서 부트스트랩의 뜻은 설치한다 정도의 의미를 갖는다. 이 과정에서 Vcpkg는 주로 환경변수에 관한 작업을 수행한다.
CMake가 환경변수에 등록되어 있지 않다면 Vcpkg는 CMake를 설치한다.
그리고 설치된 VS를 찾고 기본 참조 경로들에 Vcpkg를 등록한다.
위와 같은 창이 뜨면 된다.
Vcpkg는 반드시 C:\ 나 C:\src 같은 곳에 설치해주고, 한 번 설치된 Vcpkg는 경로를 옳기면 안된다.
특히 VS 프로젝트 폴더에 설치하는 경우도 있었는데 Vcpkg는 윈도우와 VS에 설치하는 개념임을 명심하자.
또 통상적으로 사용하는 다운로드 폴더나 경로가 30글자 정도 넘어가면 나중에 빌드할 때 경로 문제가 발생할 수 있다(경험).
설치 후 VS2017의 프로젝트 속성에서 참조 경로에 대한 매크로를 살펴보면 VcpkgRoot가 위와 같이 존재함을 확인할 수 있다.
이제 vcpkg 폴더에서 vcpkg 명령어를 사용할 수 있다.
./vcpkg integrate install 를 실행하면 위와 같은 창을 볼 수 있다.
integrate install시 VS가 참조하는 디렉터리 기본 경로에 Vcpkg가 추가되는 구조다.
차후 Vcpkg를 사용하지 않을 경우 vcpkg integrate remove를 하면 Vcpkg가 기본 VS 참조 목록에서 사용하지 않도록 설정할 수 있다.
vcpkg install glfw3만 수행해도 큰 문제는 없지만 일단 라이브러리 설치 방법이다.
위 명령어만 실행하면 glfw3 설치가 끝난다.
여기서 주의할 점은 x86-windows와 x64-windows가 별도로 되어 있다는 점이다.
x64-windows를 설치하기 위해서는 --triplet x64-windows 옵션을 위와 같이 추가해주면 된다.
sdl2, curl은 각각 호환성 라이브러리, http 클라이언트인데 GLFW와는 관련 없으니 빼고 설치해도 된다. 포함해서 설치할 경우 약 16~20분 소요된다.
vcpkg install을 수행할 경우 2가지 작업으로 나눠진다.
먼저 /vcpkg/downloads 경로에 설치할 라이브러리를 다운받는다.
그리고 앞서 설명했던 Vcpkg가 CMake를 설치/사용한다고 했던 내용이다.
C/C++ 라이브러리는 Windows에서 사용할 때 컴파일/빌드해서 lib이나 dll 형식으로 만들 필요가 있다. 이 역할을 수행하는게 CMake다.
Vcpkg는 /vcpkg/buildtrees에 라이브러리를 자동으로 설치하고 세팅해준다.
정리하자면 Vcpkg가 다운로드 받아서 CMake로 컴파일/빌드하고 Vcpkg는 CMake가 만든 파일을 쉽게 사용할 수 있도록 등록해주는 것이다.
이제 old한 GLFW 예제를 돌릴 수 있다.
따로 프로젝트 속성을 만지지 않고도 #include <iostream> 쓰듯 #include <GL/GLFW>를 사용할 수 있게 됬다.
사실 컴파일은 되지만 링킹에러가 발생할 것이다.
LNK2019 __imp_glBegin, LNK2019 __imp_glClear, LNK2019 __imp_glColor3f
이런 에러는 OpenGL 라이브러리를 참조하지 않기 때문에 발생한 문제이다.
위 에러는 opengl32.lib을 추가하면 해결된다.
솔루션 탐색기 > 프로젝트 속성 > 링커 > 입력 > 참조 라이브러리 > opengl32.lib을 추가하면 되는데, 위의 구성에서 모든 구성, 모든 플랫폼으로 두고 설정하자.
위 설정은 아까도 언급했던 x86, x64냐 debug냐 release냐에 따라서 다르게 설정되기 때문이다. 이에 대해서는 C/C++의 컴파일/링킹/빌드 동작 원리를 따로 찾아보자. 여기선 쉽게 할 수 있는 팁 위주로 공유한다.
하지만 latest를 돌리기 위해서는 좀 더 할 일이 있다. GLAD와 linmath.h를 설정해야하는 것이다. 두 라이브러리의 코드는 GLFW 공식 코드의 /deps에 제공된다. https://github.com/glfw/glfw/tree/master/deps에서 다운받자.
GLAD는 OpenGL Loading Library로 유사품은 GLEW, gl3w가 있다. 이건 OpenGL의 버전이나 구현체가 조금씩 다른 환경에서 동일한 함수를 사용할 수 있도록 만들어둔 라이브러리다. GLAD를 공식사이트에서 설치하려다가 http://glad.dav1d.de/ 에서 더 해맬 수 있으니 GLFW에 있는 코드를 일단 쓰는게 좋다.
linmath.h(https://github.com/datenwolf/linmath.h)는 vec3, vec4, mat4x4 등 수학 모듈을 모아둔 라이브러리이다. 헤더 하나가 뭔가 싶지만 C/C++에서 외부 라이브러리를 서너개씩 쓰다보면 수학 모듈을 통일할 필요가 생긴다. 그 때 참조하면 좋은 구현체다.
2. CMake를 사용하는 방법
만약 1번을 한 상황이라면 vcpkg integrate remove를 해두자.
CMake로 설치한 라이브러리와 경로가 꼬이는 상황이 발생할 수 있다.
https://github.com/glfw/glfw/releases
Git master 브랜치를 받는 경우가 있는데, 이건 개발 중인 버전으로 안정성이 보장되지 않고 문제가 발생해도 해결하기 어려운 상황이 발생한다. 조심하자.
GLFW를 CMake로 직접 빌드해서 사용하는 이유는 크게 2가지가 있다.
glfw-3.2.1.bin.WIN32나 glfw-3.2.1.bin.WIN64를 받아보면 vc2017이 없다.
즉 VS2017, VC2017, MSVC15에서 GLFW를 제대로 쓰고 싶다면 직접 빌드해야한다.
애초에 GLFW의 최신버전 3.2.1은 16년에 나왔다는 점을 명심하자.
2번째 이유는 앞으로도 다른 라이브러리를 계속 사용하게 될텐데, 대부분의 C/C++ 라이브러리나 프로젝트는 CMake를 사용한다. 사용법을 익혀둬서 나쁠 것도 없고 또 윈도우가 아닌 환경에서 C/C++을 할 때 도움이 된다. 그리고 Vcpkg도 결국 CMake를 사용하기 쉽게 묶어둔 것에 불과하며 Vcpkg에서 자동으로 설치된 라이브러리를 수정해서 써야하는 상황이 발생하면 수동으로 빌드해야한다.
CMake-gui를 받아서 위와 같이 실행해보자.
CMake를 사용하는 방법은 따로 링크해두고, 위와 같은 화면이 뜨면 정상 진행된 것이다.
다운로드 링크 : https://cmake.org/download/
다운로드 링크 : https://cmake.org/download/
CMake-gui 설치 및 사용법 : http://blog.naver.com/PostView.nhn?blogId=lithium81&logNo=80123195965
CMake에 대한 설명 : https://tuwlab.com/27193
Generate 버튼을 누르면 위와 같은 디렉터리가 생성된다.
GLFW.sln 솔루션 파일을 실행하고 위와 같이 ALL_BUILD나 INSTALL을 빌드한다.
정상적으로 빌드되면 lib 디렉터리가 생성되고 위와 같이 glfw3.lib이 생성된다.
vc2017에서 빌드한 파일은 이 글을 작성하면서 만든 예제 코드에 같이 올려놨다.
https://github.com/hyunjun529/WIN_VS_GL_Setups
https://github.com/hyunjun529/WIN_VS_GL_Setups
만약 위와 같이 MSB3073 setlocal cmake_install.cmake 에러가 발생한다면 권한 문제이다.
GLFW CMake-gui에서 자세히보면 C:\Program Files에 무언가 하려고하는데, 여기에 설치하는건 관리자권한을 필요로한다. 그런데 VS2017은 기본적으로 관리자권한이 없다.
위 에러는 CMake Generate를 하기 전에 CMAKE_INSTALL_PREFIX의 위치를 위와 같이 빌드하고자 하는 디렉터리 경로로 변경해주면 해결된다. 여기서 설정한 디렉터리에 lib 파일이 생성된다.
위와 같이 솔루션/프로젝트 속성에서 3곳을 수정해준다.
1. C/C++ > 일반 > 추가 포함 디렉터리 : include 할 glfw3.h가 있는 경로를 추가한다.
2. 링커 > 일반 > 추가 라이브러리 디렉터리 : glfw3.lib이 있는 파일의 경로를 추가한다.
3. 링커 > 입력 > 추가 종속성 : opengl32.lib과 그림에선 빠졌는데 glfw3.lib도 추가해야한다.
여기서 본인은 ./external로 상대경로를 사용했는데 왠만하면 절대경로보다 상대경로로 세팅하는게 좋다. 마찬가지로 이 예제 프로젝트는 GitHub 저장소에 바로 실행할 수 있는 버전으로 올려놨다.
https://github.com/hyunjun529/WIN_VS_GL_Setups/blob/master/2_using_CMake/2_using_CMake.vcxproj#L96
https://github.com/hyunjun529/WIN_VS_GL_Setups/blob/master/2_using_CMake/2_using_CMake.vcxproj#L96
그 후 추가 포함 디렉터리 등을 좀 더 설정해서 ./GLFW/deps도 추가해주면 위와 같이 GLFW 예제 2개를 모두 실행할 수 있는 프로젝트가 설정/세팅 완료된다.
3. 외부 라이브러리(dear imgui)를 사용해보자
dear imgui는 OpenGL을 사용하는 환경에서 쉽게 GUI를 구성할 수있게 해주는 라이브러리다.
위와 같은 GUI를 코드 몇 줄로 쉽게 사용할 수 있다. WinAPI나 WinForm, QT, nana, GLFW GUI등을 고려하고 있다면 imgui 또는 nanogui로 갈아타자.
이 예제는 imgui를 GLFW에 연동하고 modern OpenGL로 그린 깨달음!삼각형을 제어하는 것 까지 진행한다.
마찬가지로 imgui 라이브러리도 GitHub 저장소에서 받을 수 있다.
지금까지 언급된 설치 방법을 참조해서 위와 같이 설정하면 된다.
일단 imgui를 포함해서 빌드할 수 있는 곳까지 진행해보자.
imgui의 공식 예제는 GLFW + gl3w를 사용한다.
GLFW quick 예제는 GLFW + GLAD를 사용한 것과 다른 양상이다.
본 예제는 GLFW quick에 있는 렌더링 코드를 GLAD에서 gl3w로 옮겼다.
앞서 짧게 소개한대로 GLFW는 창과 입력에 대한 지원을 제공하는 라이브러리라고 소개했다. imgui에서 GLFW를 통해 이벤트를 받을 수 있도록 연결해주는 작업이 필요하다.
위 링크가 해당 코드인데, gl3w를 사용하고 있다. 헤더파일을 살펴보면 이 파일이 하는 역할은 키보드, 마우스 등의 입력을 imgui가 사용할 수 있도록 추상화해둔 것을 알 수 있다.
위에서 언급한 2가지만 주의하면 쉽게 imgui를 붙일 수 있다.
위 링크는 CMake로 직접 빌드한 버전에 imgui를 적용한 예제이다.
---
늦었지만 이 글은 처음 OpenGL을 접하고 프로젝트 설정하는 사람들을 대상으로 적었습니다. 또 Vcpkg와 CMake 사용법과 원리에 대한 내용, imgui 소개가 섞여있습니다.
읽다가 어려운 부분이나 잘못 설명된 부분이 있으면 댓글로 지적해주시면 감사하겠습니다.
깔끔하게 잘 정리해 주셔서 도움이 많이 되었습니다. 고맙습니다.
답글삭제