※ 본 포스팅은 learnopengl.com을 번역 및 가감한 포스팅이며, learnopengl에서는 번역 작업 참여를 적극 장려하고 있습니다!
아래 링크에서 원문을 확인할 수 있습니다.
Creating a window
그래픽을 그리기 위해서는 opengl context를 만들고 애플리케이션 window을 만들어야합니다. OS마다 그 방법은 다르지만 opengl은 추상화된 방법으로 구성되어있습니다. window를 만들기 위해선 context도 정의해야하고, 사용자 입력에 대한 작업들도 직접 처리해야합니다.
하지만 처음부터 할 필요없이 일부 기능은 라이브러리를 사용해도 충분합니다. opengl을 타겟으로 개발된 라이브러리도 많기 때문에 이것들이 OS에 특화된 작업을 처리하고 window와 context도 제공해줍니다. 예를 들어 GLUT, SDL, SFML, GLFW 등이 이런 라이브러리들입니다. learn opengl에서는 GLFW를 사용하는데, 번역자 또한 opengl을 처음 공부할 때 GLFW를 사용하여서 상당히 보편적으로 공부하기 좋은 라이브러리입니다. 다른 라이브러리를 사용한다고 하여도 설정 방법은 크게 다르지 않습니다.
GLFW
GLFW는 opengl을 위해서 C로 작성된 라이브러리 인데요. 화면에 그래픽 렌더링을 할 때 필요한 기능들을 제공하고 있습니다. 이제부터 GLFW를 설치 및 실행한 다음, opengl context를 생성하고 window를 띄워볼 것입니다. 순서는 라이브러리 다운로드, 빌드, 링크 순서로 진행됩니다. IDE환경은 Microsoft Visual Studio IDE를 사용하게 될 것입니다. 설명은 2019 버전에서 이루어지지만 다른 버전이더라도 같은 방법으로 진행할 수 있습니다.
Building GLFW
GLFW는 공식 웹페이지에서 다운로드 받으실 수 있습니다. Visual Studio에는 이미 precompile된 바이너리와 헤더 파일로 실행하는 방법이 있지만, 우리늰 완전한 코드를 사용하기 위해 직접 GLFW 소스 코드를 받고 컴파일하도록 합니다. 보통 모든 라이브러리가 미리 컴파일된 바이너리를 제공하지는 않아서, 오픈 소스의 라이브러리를 직접 컴파일하는 경험이 있으면 좋겠습니다.
아래 링크에서 Source package를 다운받으세요.
모든 라이브러리를 64비트 바이너리로 빌드할 거기 때문에, precompiled 바이너리를 사용한다면 64비트 바이너리를 받아야 합니다.
source package를 다운로드 했다면, 압축을 풉니다. 여기서 중요한 건 컴파일해서 만들어진 library와 include 폴더를 가져와야합니다.
소스 코드에서 라이브러리를 컴파일하면, 생성된 라이브러리가 여러분의 CPU와 OS에 맞추어서 컴파일되는데요. precompiled 바이너리들은 항상 이렇게 맞춰주지는 않기 때문에 어려운 점이 있습니다. 반면 소스 코드를 이용하는 것에는 모든 개발자가 동일한 IDE나 빌드 시스템을 사용하지 않을 수도 있어서 서로 맞지 않을 수 있습니다. 프로젝트나 솔루션 파일의 설정이 호환되지 않으면 세팅이 어렵겠죠.
그렇다고 모두가 주어진 cpp파일과 헤더 파일로 각자의 프로젝트를 설정해야하는건 힘드니까 CMake라는 툴을 많이 사용합니다.
CMake
CMake는 미리 정의된 스크립트를 사용해서 소스 코드 모음에서 프로젝트의 솔루션(Visual Studio, Blocks, Eclipse)을 생성하는 도구입니다. GLFW의 소스 패키지에서 Visual Studio 프로젝트를 생성하고 라이브러리를 컴파일해보도록 합시다. 먼저 프로젝트 생성을 위한 CMake를 공식 페이지에서 다운로드합니다.
CMake 설치 이후에는 명령 프롬프트에서 실행하거나 GUI를 사용할 수 있습니다. GUI를 사용하는게 보통 많이 익숙할 것 같습니다. CMake는 소스 코드 폴더와 바이너리를 위한 경로가 각각 필요한데요. 소스 코드 폴더는 GLFW 소스 패키지의 루트 폴더를 선택, 바이너리 빌드 폴더는 새로 build라는 디렉토리를 선언합니다.
소스 폴더, build 폴더를 설정하면 configure 버튼을 클릭해서 CMake에 필요한 설정과 소스 코드를 읽는 과정을 거칩니다. 그 다음, 프로젝트를 위한 generator를 선택해야합니다. 현재 Visual Studio 2019를 기준으로 하고 있지만 따라하시는 분들은 각자의 Visual Studio 버전에 맞춰 하시면 됩니다. 2019의 경우에는 2016으로 알려져 있기도 해서 2016으로 고르시면 됩니다.
사진의 오른쪽을 보면 Cmake는 이후 라이브러리를 생성할 때 구성할 빌드 옵션들을 표시해줍니다. 지금은 기본값으로 진행하도록 합시다. Configure 버튼을 클릭해서 설정을 저장하고, 저장 후 Generate 버튼으로 빌드 폴더에 프로젝트를 생성합니다.
Compilation
build 폴더에는 GLFW.sln 파일이 생성되었을 겁니다. 이걸 Visual Studio로 열 수 있습니다. CMake가 이 프로젝트를 알맞은 설정으로 생성한 것이라서 솔루션을 빌드하기만 하면 라이브러리를 컴파일 할 수 있습니다. CMake는 솔루션이 64bit 라이브러리로 컴파일되도록 자동으로 설정 해놓은 상태라서 솔루션 빌드를 클릭하면 build/src/Debug 폴더에 glfw3.lib라는 컴파일된 라이브러리 파일이 생성되게 됩니다.
라이브러리를 생성한 후, IDE가 OpenGL을 실행할 수 있으려면 라이브러리와 같이 포함해야하는 파일을 어디에서 찾아야하는지 경로를 알 수 있는 설정을 해주어야 합니다. 보통 두 가지 방법을 사용합니다.
- IDE 즉 여기서는 Visual Studio 프로젝트에 필요한 library파일들이나 포함해야하는 파일들을 프로젝트 솔루션 내부 /lib 폴더나 /include 폴더에 넣어놓는 방법이 있습니다. GLFW의 include 폴더에 있던 스크립트들을 Visual Studio IDE의 /include 폴더에 추가합니다. 그리고 glfw3.lib를 IDE의 /lib 폴더에 추가해줍니다.
이건 동작하긴 하지만 요즘에 권장되는 방법은 아닙니다. 라이브러리와 포함 파일이 어딨는지 찾기 어렵기도 하고, IDE/compiler를 새로 설치할 때마다 같은 작업을 반복해야 합니다. - 권장하는 방법은 여러분이 원하는 위치에 새로운 폴더를 만들고, 서드파티 라이브러리의 모든 헤더 파일과 라이브러리를 그 폴더에서 관리하는 것입니다. Visual Studio와 같은 IDE/compiler에서 이 경로를 참조할 수 있도록 설정해줍니다.
예를 들어, OpenGL 프로젝트에 모든 라이브러리와 헤더 파일을 폴더 하나를 만들고, 그 아래에 Libs와 Include 폴더를 넣어주는 방식입니다. 그러면 서드파티 외부 라이브러리가 깔끔하게 정리되고, 다른 사람들과도 쉽게 공유할 수 있습니다. 단점이 있다면 새로운 프로젝트를 생성할 때마다 IDE에 경로 설정을 해주어야한다는 점 뿐입니다.
라이브러리와 헤더 파일들을 외부 라이브러리 폴더를 만들어서 저장하고, OpenGL GLFW 프로젝트를 시작해봅시다.
Our first project
자 이제 Visual Studio를 열어서 새 프로젝트를 만들고요. 옵션은 C++ 빈 프로젝트로 생성하면 됩니다. 플랫폼은 64bit로 진행하기 때문에 x86으로 설정되어있다면 x64로 바꿔주세요.
설정이 완료되면 opengl로 첫 프로그램을 만들 공간이 준비된 겁니다!
Linking
프로젝트에서 GLFW를 사용하려면 라이브러리를 프로젝트에 link 해야합니다. Visual Studio의 프로젝트 링커 설정에서 glfw3.lib를 사용할 수 있도록 경로를 지정해야하는데요. 프로젝트가 glfw3.lib 파일의 위치를 알 수 있도록 디렉토리 경로를 추가해야합니다.
IDE가 라이브러리나 추가로 포함되어야하는 파일을 찾기 위해서 디렉토리 참조 설정을 해주어야합니다. 솔루션 탐색기에서 프로젝트 이름을 오른쪽 클릭한 후, VC++ 디렉터리로 이동하고 아래 이미지처럼 설정해주세요.
그 다음에, 프로젝트가 검색할 위치를 알 수 있도록 디렉토리를 추가할 수 있습니다. 폴더 경로를 텍스트로 넣을 수도 있고, 편집 옵션을 사용해서 수정할 수 있습니다. 이렇게 경로를 지정해주는 것은 추가 라이브러리 디렉터리와 추가 포함 디렉터리 두 개 다 해주어야합니다.
여기에서 원하는 만큼 디렉토리 경로를 추가할 수 있습니다. 추가하면 Visual Studio등의 IDE는 라이브러리와 헤더파일을 디렉토리에서 검색해서 찾을 수 있게 됩니다. 즉 GLFW의 include 폴더를 추가하면 GLFW/ 경로 안에있는 모든 헤더 파일을 찾을 수 있죠. 라이브러리도 똑같이 됩니다.
이제 Visual Studio에게 필요한 라이브러리와 헤더가 있는 위치를 알려주으니, 링커(linker) 탭으로 이동해서 입력(input) 탭에서 GLFW 관련 lib 파일들을 연결시키면 됩니다.
라이브러리를 연결하기 위해 라이브러리를 dependency에 지정해야합니다. 사용할 glfw3.lib 라이브러리를 추가 종속성(additional dependencies)에 추가하여 GLFW를 link 시킵니다. 그리고 GLFW말고도 OpenGL 라이브러리도 링크에 추가합니다. 근데 이건 운영체제마다 다를 수도 있습니다.
라이브러리 및 포함 디렉터리 설정을 할 때 유의해야하는 점은 프로젝트 속성에서 Configuration(구성)과 Platform(플랫폼)이 맞는지 잘 확인하셔야합니다.
우리는 Debug 구성 x64 플랫폼 환경에서 진행하고 있습니다.
OpenGL library on Windows
윈도우 사용자라면 Opengl 라이브러리 opengl32.lib는 microsoft SDK와 제공되기에 Visual Studio에 내장되어있습니다. Visual Studio 환경이라면 링커에 opengl32.lib를 추가하면 됩니다. 참고로 64비트도 32비트도 동일하게 opengl32.lib를 사용합니다.
만약 opengl32.lib 가 없다는 오류가 생긴다면?
OpenGL library on Linux
리눅스에서는 libGL.so 라이브러리를 링크해야하고, 링커 설정에서 -lGL을 추가합니다. 라이브러리가 없다면, Mesa, NVidia, AMD 등 개발 패키지를 설치해야할 수도 있습니다.
설치했다면 링커에 GLFW와 OpenGL라이브러리를 모두 추가해서 GLFW의 헤더 파일을 include 하면 됩니다.
#include <GLFW/glfw3.h>
만약 리눅스 사용자이고, GCC로 컴파일 하신다면,
아래 명령어 옵션들이 프로젝트 컴파일하는 데 도움이 될 수 있습니다.
-lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -ldl
라이브러리를 올바르게 링크하지 않으면 정의되지 참조 오류라는 에러가 발생할 수 있습니다.
이렇게 GLFW 설정 방법을 알아보았습니다.
GLAD
아직 끝나지 않았습니다. 라이브러리가 하나 더 있습니다.
OpenGL은 표준 API라서 각 그래픽 카드 드라이버를 만드는 제조업체가 이를 구현해야하는데요. OpenGL은 드라이버가 여러 버전이 있고, 함수의 위치를 컴파일 시점에 알려주지 않고 런타임에 요청하는 방식입니다.
그래서 개발자가 필요한 함수의 위치를 직접 포인터에 저장해서 사용하는 식으로 구성됩니다. 참조 위치를 가져오는 방식은 OS마다 다른데, 윈도우는 아래와 같이 진행됩니다.
// Example for Windows
typedef void (*GLFunc)(void);
GLFunc glFunction = (GLFunc)wglGetProcAddress("glFunctionName");
if (!glFunction) {
// Handle error: function not found
}
이렇게 opengl 함수의 위치를 가져와서 포인터에 담아 사용합니다.
아직 코드를 이해하기 쉽지 않은데, 선언되지도 않은 함수에 대해서 예외처리를 하고 있는게 번거롭죠. 그래서 GLAD라는 라이브러리가 있는 겁니다. GLAD는 OpenGL 함수 로딩을 자동화해서 위 과정을 간편하게 해줍니다.
Setting up GLAD
GLAD는 함수 호출에 대한 번거로운 작업을 관리해주는 라이브러리입니다. 다른 오픈 소스 라이브러리와는 설정 방법이 좀 다른데, GLAD 웹사이트에 들어가서 OpenGL버전을 선택하고 버전에 맞는 함수들을 정의 및 로드할 수 있는 라이브러리를 제공합니다. 아래 사이트에서 GLAD 라이브러리를 추출할 수 있습니다.
위 GLAD 사이트로 들어가서 언어를 C++로 설정하고, API에서 OpenGL 버전은 3.3 이상으로 선택합니다. profile은 Coore로 설정하고 Generate a loader 옵션은 체크 상태로 유지합니다. extensions는 지금은 보지 않고 Generate 버튼을 누르면 라이브러리 파일을 생성합니다.
위 링크 말고도 GLAD2 버전 사이트가 있는데, 이는 우리의 환경에서는 컴파일 되는 것이 아니니 유의하세요.
GLAD에서 받은 zip 파일에는 glad, KHR 두 개의 include 폴더랑 glad.c 파일이 있습니다. include안에 있는 glad와 KHR 두 개의 폴더를 추가 포함 디렉터리에 복사해 넣든지, 두 폴더들에 대한 경로를 추가하든지 방식으로 링커에 포함하세요. 그리고 glad.c는 프로젝트에 추가합니다.
여기까지 한 후 파일 상단에 include로 헤더를 추가하세요.
#include <glad/glad.h>
컴파일시 에러가 없으면 넘어가실 수 있습니다. 다음 포스팅에서는 GLFW와 GLAD를 사용해서 OpenGL context를 구성하고 창을 생성하는 방법에 대해 본격적으로 알아봅시다.
Additional resources
아래는 도움이 되는 자료들입니다.
https://learnopengl.com/demo/autotools_tutorial.txt
'개발 · 컴퓨터공학 > LearnOpenGL' 카테고리의 다른 글
OpenGL 그래픽 파이프라인 [Learn OpenGL 쉬운 번역] (0) | 2024.08.22 |
---|---|
OpenGL 엔진 구현 시작하기 [Learn OpenGL 쉬운 번역] (0) | 2024.08.22 |
OpenGL 윈도우 띄우기 [Learn OpenGL 쉬운 번역] (0) | 2024.08.22 |
opengl 이란? opengl 개념 정리 [Learn OpenGL 쉬운 번역] (0) | 2024.08.22 |
learn opengl 소개 [Learn OpenGL 쉬운 번역] (0) | 2024.08.18 |