2018년 1월 31일 수요일

imgui image 함수로 scene 만들기

imgui에서 Image를 통해 3D element를 렌더링 하는 방법



imgui UI 내에 scene을 그리는 예제를 만들어봤다.
이를 통해서 GLFW Window(Context)를 동시에 처리 하는 방법을 익힐 수 있었다.
또 그래픽스 라이브러리를 사용할 때 주의점이나 팁, 그리고 멀티스레드로 OpenGL을 렌더링하는 방법 등에 대해서 다룬다.

저거 하나 만드는데 알아야 되는게 생각보다 너무 많았다

중간중간 이미지로 삽입된 코드는 GitHub 저장소에 올려놨다.
VS2017 환경에선 다운 받아서 바로 돌릴 수 있게 정리해뒀다.
https://github.com/hyunjun529/WIN_VS_GL_Setups/blob/master/4_imp_scene_in_imgui/main.cpp

imgui 

Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies
쉽게 설명하면 UI를 운영체제가 아니라 그래픽스 라이브러리를 통해서 그린다는 소리다.

아래는 imgui를 예시 목록이다.
그래픽스 에디터, 게임 툴, 엔진, 유체 시뮬레이션, Mod 제작 등에 사용되고 있다.

사전 조사

처음 이미지처럼 imgui window 내에 scene을 만들기 위한 예제를 찾아봤다.
사실 imgui window의 image를 통해서 렌더링하는 3D Element, widget 등에 정해진 명칭은 없다. 이 글에서는 해당 요소가 Unity 같은 게임 엔진에서 비슷한 역할을 한다는 의미로 scene이라 부른다.

근데 원리를 설명해둔 부분이나 깔끔한 예제 코드가 없어서 직접 공부해야 했다.
보통 내가 잘 모르겠으면 남들도 잘 모르는 거다. imgui 이슈트래커에 가장 비슷한 이슈로는 아래 두 가지가 있었다.

How to render 3D scene within UI Element ?
https://github.com/ocornut/imgui/issues/475

Rendering am image
https://github.com/ocornut/imgui/issues/561


기본 원리

핵심은 2가지다.
1. GL Context를 별도로 생성하고 관리해야한다.
2. imgui Image()는 Image를 Texture로 그리는거다

Image()는 이름만 같고 운영체제에서 GUI 코딩이나 웹 프론트엔드의 개념과 전혀 다름을 명심하자.

scene을 생성하기 위해서는 다음과 같은 과정을 거친다.
1. scene을 렌더링할 OpenGL Context를 하나 더 생성한다.
2. 이를 위해서 GLFWwindow를 하나 더 생성한다(hidden).
3. hidden은 실제 화면에 그리지 않고 백그라운드에서 렌더링만 수행한다.
4. hidden에서 렌더링된 화면을 픽셀로 저장한다.
5. 4번에서 저장한 픽셀을 main에 전달한다.
6. main에서 imgui Image()로 hidden의 픽셀을 텍스쳐로 렌더링한다.

구현

이미지가 아닌 실제 코드는 아래 링크해둔 저장소에 있고 WIN10, VS2017로 바로 실행할 수 있도록 정리해놨다.
https://github.com/hyunjun529/WIN_VS_GL_Setups/blob/master/4_imp_scene_in_imgui/main.cpp

위와 같이 GLFWwindow를 관리하는 클래스를 따로 만들어둔다.
70줄에 있는 *window는 저렇게 쓰면 좋지 않지만 이후 설명을 위해서 저렇게 해뒀다.

setup()과 render()를 기본적으로 따로 관리해두자.
setup은 렌더링할 객체를 세팅하는 부분, render는 렌더링 루프에서 매번 실행할 함수다.

main 함수에서에서 GLWindow 클래스를 2개 생성한다.
main은 imgui가 있는 화면, hidden은 scene에 삽입할 화면이다.

window_main과 window_hidden을 각각 setup()해준다.
setup() 함수는 vertex binding, shader program을 세팅한다.

ImGui를 초기화 할 때 window_main를 사용하도록 해준다.

window_hidden은 glfwHideWindow를 설정해서 백그라운드에서 동작하도록 한다.
다른 옵션도 찾아보면 더 있는거 같지만 나중에 show()로 확인하기 위해서 사용.

그리고 glfwMakeContextCurrent가 핵심이다.
http://www.glfw.org/docs/latest/group__context.html#ga1c04dc242268f827290fe40aa1c91157
이 함수를 호출하는게 번거롭지만 멀티스레드 환경의 렌더링을 편하게 지원해준다.
가장큰 문제는 스코프를 명시하지 못하니 나중에 클래스로 묶을 때 주의해야한다.
glfwGetCurrentContext로 현재 Context를 확인하는 것도 방법이다.
http://www.glfw.org/docs/latest/group__context.html#gac84759b1f6c2d271a4fea8ae89ec980d

렌더링을 수행하는 루프.
보다시피 window_hidden과 window_main을 따로 렌더링한다.

window_hidden을 렌더링 한 후 glReadPixels로 렌더링된 화면을 저장한다.

하지만 이 함수로 얻은 이미지를 바로 사용하면 상하 반전(flip, flipped)되어 있다.
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glReadPixels.xhtml
lower left corner에서 0.0으로 잡았기 때문인데 이는 아래 그림과 같다.

만약 영상처리나 파일 저장의 경우 일반적으로 역순으로 출력하면 된다.
하지만 우리는 이를 텍스쳐로 바로 옮겨야한다.

가장 쉬운 접근은 for문으로 역으로 뒤집는 방법을 떠올릴 수 있겠지만 우리는 이 픽셀 데이터를 텍스쳐로 다룬다는 사실을 명심하자.
http://dogfoottech.tistory.com/59

듀토리얼에도 따로 문서화도 없는 이유는 이 라이브러리를 쓰는 사람이 기본적으로 이런 지식을 알고 있으리라 기대하기 때문이다.
사전 조사에서 봤던 2가지 이슈도 이래서 해맸을 가능성이 높다.

ImGui::Image 함수를 살펴보자.
https://github.com/ocornut/imgui/blob/master/imgui.cpp#L6502
함수 인자에 uv0, uv1이 있다. 그리고 우리가 저장한 픽셀 데이터는 Texture2D로 처리된다.

즉 imgui image는 평면 GUI로 보이지만 Image를 삽입하기 위해서, 또 Plot, Font를 처리하기 위해서 Texture를 사용한다.

상하 반전을 하기 위해서 Texture를 거꾸로 씌우면 된다. 이에 관한 내용은 uv를 참조
http://www.opengl-tutorial.org/kr/beginners-tutorials/tutorial-5-a-textured-cube/

위 과정을 통해서 scene 기능을 구현할 수 있었다.

---

여담

Bullet Physics 2.87 ExampleBrowser

이 블로그에서 계속 OpenGL이나 GLFW, imgui 등을 다루고 있는 이유는 최종적으로 Bullet Physics 같은 엔진(?)을 구현하기 위함이다.
18년 2월내로 기본적인 기능은 완성하는게 목표고 중간중간 구현했던 내용을 블로그에 남기는 중이다.

2018년 1월 24일 수요일

GLFW 사용 방법 정리 (Windows 10, Visual Studio 2017)

외부 라이브러리(imgui)까지 세팅한 이 글의 최종 예제

Windows 10, Visual Studio 2017에서
GLFW를 사용해 OpenGL 프로젝트 세팅하기

윈도우 환경에서 C++로 OpenGL을 실습하려면 Visual Studio 2017 (이하 VS2017)를 설정해야한다. 하지만 이 세팅하고 설치하는 방법이 쉽지않다.
그래서 Vcpkg를 통해서 설치하는 방법과 CMake로 직접 빌드하는 방법을 소개하고 외부 라이브러리를 추가로 사용하는 방법을 소개하기 위해 dear imgui를 사용하는 예제까지 정리해둔다.
해당 블로그 글의 예제는 아래 GitHub 저장소에서 받아쓸 수 있다.

OpenGL은 삼각형만 그릴 수 있으면 깨달음을 얻은거다

0. GLFW

GLFW(http://www.glfw.org/)는 OpenGL을 데스크탑에서 쉽게 사용할 수 있도록 해주며 멀티 플랫폼을 지원하는 라이브러리이다. 주로 창(Window)과 입력(I/O) 구현을 보조해준다.
비슷한 역할을 하는 라이브러리로 GLUT(https://www.opengl.org/resources/libraries/glut/)이 있다. 사족이지만 GLUT을 사용할 경우도 이 글에서 설명한 것과 동일한 방법으로 설치할 수 있다.

본 글에서는 GLFW를 세팅한 후 quick이라고 불리는 코드가 실행될 수 있도록 확인 과정까지 거친다. quick을 실행해봄으로써 설치가 제대로 이뤄졌는지 확인할 수 있다.
quick은 2가지 버전이 있는데 3.0과 latest이다.

두 버전의 차이는 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)이다.
공식 문서에 설치 방법과 설명서가 있고 공식 블로그에 Vcpkg로 설치할 수 있는 라이브러리의 목록이 있다.
이 글에서는 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로 설치한 라이브러리와 경로가 꼬이는 상황이 발생할 수 있다.

GLFW는 GLFW 공식 GitHub 저장소의 릴리즈 탭에서 받을 수 있다.
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/ 
CMake에 대한 설명 : https://tuwlab.com/27193

Generate 버튼을 누르면 위와 같은 디렉터리가 생성된다.

GLFW.sln 솔루션 파일을 실행하고 위와 같이 ALL_BUILD나 INSTALL을 빌드한다.

정상적으로 빌드되면 lib 디렉터리가 생성되고 위와 같이 glfw3.lib이 생성된다.
vc2017에서 빌드한 파일은 이 글을 작성하면서 만든 예제 코드에 같이 올려놨다.
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

그 후 추가 포함 디렉터리 등을 좀 더 설정해서 ./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 소개가 섞여있습니다.
읽다가 어려운 부분이나 잘못 설명된 부분이 있으면 댓글로 지적해주시면 감사하겠습니다.

2018년 1월 14일 일요일

VS2017에서 CMake로 GLFW 프로젝트 만들기


윈도우, Visual Studio에서 C++ 프로젝트를 CMake로 관리할 수 있는 기능이 VS2017에서 추가됬습니다.
https://docs.microsoft.com/ko-kr/cpp/ide/cmake-tools-for-visual-cpp

CMake로 생성된 프로젝트는 리눅스에서 빌드하고 디버깅할 수 있다고 합니다.
Visual C++ Team Blog : https://blogs.msdn.microsoft.com/vcblog/2017/04/11/linux-development-with-c-in-visual-studio/
한글 메뉴얼 : https://docs.microsoft.com/ko-kr/cpp/linux/download-install-and-setup-the-linux-development-workload

이 기능을 테스트하기 위해서 GLFW(http://www.glfw.org/)를 사용하는 CMake 프로젝트 예제를 만들어 봤습니다.
https://github.com/hyunjun529/test_VS2017_CMake


---


Visual Studio에서 GLFW나 GLUT, OpenCV 등을 불러서 쓰면 보통 다음과 같은 프로젝트/솔루션 속성창에서 작업하게 됩니다.
저는 크게 3가지 방법으로 사용해왔습니다.



1. 설치하면 기본 경로에 lib, dll이 생기고. 소스 코드는 프로젝트내에 하드카피.
2. CMake를 빌드하고 속성에 직접 경로를 설정해준다.
3. C++ 패키지 관리자인 Vcpkg(https://github.com/Microsoft/vcpkg)를 활용한다.

1번은 제일 편하지만 대부분 라이브러리나 프레임워크가 이렇게까지 제공해주지 않습니다.
2번은 처음엔 생소하지만 편해지면 쓸만합니다. 대신 경로 관리하기가 좀 까다롭습니다.
3번은 경로 관리하기는 편한데 나중에 유지보수할 때, 특정 라이브러리를 다시 빌드해야하는 상황에서 귀찮아집니다. 또 원하는 설정으로 빌드하기가 까다롭습니다.

CMake로 GLFW 프로젝트를 만들어본 이유도 세 가지인데, 첫째로 프로젝트 속성보다 관리하기 편해보였고 둘째로 리눅스에 바로 연결해서 빌드할 수 있다는 광고를 봐서 테스트해보고 싶다. 그리고 CMake에 대해서 공부를 해보려는 목적이었습니다.


---


CMake 버전은 서버 모드가 지원되는 3.7, VS 공식으론 3.8 이상을 사용해야 합니다.
https://docs.microsoft.com/ko-kr/cpp/linux/cmake-linux-project
https://cmake.org/cmake/help/v3.7/release/3.7.html

CMake에 관한 튜토리얼은 TUWLAB 블로그의 글이 제일 좋았습니다.
https://tuwlab.com/27193

GLFW는 3.2.1 버전을 사용했습니다.
https://github.com/glfw/glfw/releases/tag/3.2.1
https://github.com/glfw/glfw/tree/999f3556fdd80983b10051746264489f2cb1ef16

CMake로 빌드하는 김에 GLFW를 Git Submodule로 받아 전부 엮어서 빌드하는 것도 테스트해봤습니다.
하지만 CMakeSettings.json을 활용하는 편이 더 간단하고 좋았습니다.
https://go.microsoft.com//fwlink//?linkid=834763

CMakeLists.txt를 Visual Studio 2017에서 직접 수정하는 것보다 VS Code에 아래 확장을 설치하고 쓰는게 편했습니다.
https://marketplace.visualstudio.com/items?itemName=vector-of-bool.cmake-tools

---


전체 코드는 GitHub(https://github.com/hyunjun529/test_VS2017_CMake).


- 버전을 3.8 이상으로 명시할 것
- CMAKE_MODULE_PATH를 이용해서 외부 라이브러리를 땡겨옵시다.


- 소스코드는 위와 같이.
- add_executable을 솔루션 하나로 생각하면 편합니다.


- CMake Module로 외부 라이브러리를 땡겨옵니다.
- 일단 윈도우에서만 쓸 수 있게 대충 써놨는데, 리눅스에선 좀 바꿔야 할지도 모릅니다.


- CMakeLists.txt 우클릭, 설정 변경을 클릭하면 자동으로 생성됩니다.
- 여기에서 빌드 설정을 할 수 있습니다.
- 리눅스에서 빌드할 때 파라미터를 여기 넣습니다.


---


CMake로 VS 프로젝트를 만들었을 때 장점과 단점.


장점
- 공부가 된다.
- 솔루션 속성으로 관리하는 것보다 신경써야 하는 항목이 적다.
- (테스트 예정)리눅스에서 VS2017로 디버깅할 수 있다.


단점
- 윈도우에서만 쓸 예정이면 굳이 쓸 만큼 장점이 없다.
- IntelliSense가 CMakeLists.txt를 읽고 캐싱하는 부분에 잔버그가 있다.
- 여러 사람과 작업해야 하는 경우, 진입장벽이나 러닝커브가 높을 것 같다.

OpenGL로 FPS 카메라 구현하기

https://youtu.be/ikhlwGKKqZk 대학교 그래픽스 강의에서 OpenGL로 간단한 FPS를 구현했었습니다. 세가 신입사원 책이랑 게임 프로그래밍 패턴 책을 참고했었습니다. 핵심 아이디어만 간단히 요약해서 정리해둡니다. ...