Back to top

LearnOpenGL(01) 창 만들기

작성날짜 2022/06/20

이전글: LearnOpenGL(00) 소개

다음글: LearnOpenGL(02) Hello Window


Creating a window


우선 OpenGL을 사용하기 위해선 OepnGL이 그려질 창이 필요합니다. 하지만 창을 만드는 것은 운영체제마다 방법이 다르며 이는 우리가 직접 창을 만들고, 컨텍스트를 정의하고, 입력을 처리해야함을 의미합니다.

다행히도 우리가 원하는 기능들을 제공하는 라이브러리들이 여러가지 있으며 이것들이 운영체제 별로 작업을 처리해줍니다. 우리는 이러한 라이브러리 중 GLFW를 사용할 것입니다.


GLFW


GLFW는 OpenGL을 위해 C로 쓰여진 라이브러리입니다. GLFW는 화면에 물체들을 렌더링할 때 필요한 최소한의 필수품들을 제공해줍니다. OpenGL 컨텍스트를 만들고, 창 매개변수를 정의하고, 사용자 입력을 처리해주는데, 우리의 목적에는 이 정도면 충분합니다.

 

이번 챕터와 다음 챕터의 목적은 GLFW를 가져와 작동시키는 것입니다. OpenGL 컨텍스트를 올바르게 생성하고 우리가 가지고 놀 창을 생성하는지 확인해주세요. 이번 장에선 한 단계, 한 단계씩 검색하고, 빌딩하고, GLFW 라이브러리를 링킹합니다. 개발도구는 비주얼 스튜디오를 사용하지만 원한다면 다른 걸 사용하셔도 됩니다.


Building GLFW

GLFW는 이곳에서 받을 수 있습니다. GLFW는 이미 컴파일 된 바이너리와 헤더파일을 제공해주지만 우리는 완전성을 위해 직접 소스코드를 컴파일하겠습니다. 모든 라이브러리들이 GLFW처럼 컴파일된 바이너리를 제공해주는 것은 아니므로 여러분들이 직접 소스코드를 직접 컴파일하는 과정을 느껴보도록 하려는 것입니다. 그러면 Source package를 다운 받습니다.

우리는 모든 라이브러리를 64-bit 바이너리로 빌딩할 것이므로 만약 이미 컴파일된 바이너리를 이용하려면 64-bit 바이너리가 맞는지 확인하세요.

소스 패키지를 받았으면 압축을 풀고 폴더를 열어주세요. 우리는 폴더 속 다음 항목들을 이용합니다:

  • 컴파일 결과 라이브러리
  • include 폴더

소스 코드에서 직접 컴파일한 라이브러리는 당신의 CPU/OS에 딱 맞춰졌다는 것을 보장합니다. 이미 컴파일된 럭셔리한 바이너리는 이러한 점을 항상 보장해주진 않습니다(때때로 당신의 컴퓨터에서 동작하지 않을 수도 있습니다). 하지만 소스 코드를 사용하는 것에도 문제가 있는데 바로 모든 사람들이 같은 개발 도구를 사용하지 않는다는 점입니다. 이 점 때문에 프로젝트/솔루션의 환경설정 때문에 문제가 일어날 수도 있습니다. 이 때문에 사람들은 주어진 .c/.cpp 와 .h/.hpp 파일들에 맞게 프로젝트/솔루션의 환경설정을 해야하는 번거로움이 있습니다. 바로 이러한 이유로 CMake라는 도구가 있습니다.


CMake

CMake는 프로젝트/솔루션을 사용자의 선택(비주얼 스튜디오나 코드 블록 등)에 맞춰 미리 정의된 CMake 스크립트에 따라 프로젝트/솔루션을 생성해주는 도구입니다.CMake는 이곳에서 다운받습니다.

CMake를 설치하고 나면 명령줄(콘솔)이나 GUI를 중 실핼 방법을 선택할 수 있습니다. 너무 복잡하게 하려는 것이 아니므로 GUI를 사용하겠습니다. CMake에는 소스 코드 폴더와 바이너리가 생성될 대상 폴더가 필요합니다.소스 코드 폴더에는 다운받아 놓은 GLFW 폴더를 선택하고 빌드 폴더에는 새로 빌드 폴더를 만들어 준 후 그 경로를 선택합니다.

rte_image_56.png


폴더를 설정하면 Configure 버튼을 눌러 사용하는 IDE를 선택해주고 나머지는 기본 값으로 둡니다.

rte_image_58.png


그리고 Generate 버튼을 눌러 프로젝트 파일을 생성합니다.

rte_image_60.pngbuild 폴더에 들어가보면 자주 보던 형식의 프로젝트가 생성되어 있습니다!

build 폴더 내부에 GLFW.sln이라는 파일을 찾을 수 있을텐데 비주얼 스튜디오로 열어줍시다. CMake가 프로젝트 파일을  적절한 설정으로 생성했으므로 이걸 빌드 해주기만 하면 됩니다. CMake가 자동으로 솔루션을 64-bit로 설정했을테니 빌드 버튼을 눌러줍시다. 빌드가 완료 되면 build/src/Debug 경로에 glfw3.lib가 생성됩니다.


평소처럼 ctl + F5를 눌러서 빌드를 하면

rte_image_77.png

이런 오류창이 뜰텐데 아마 exe파일이 생성되지 않아 실행을 할수가 없어 이런 오류가 뜨는 것 같다.

article_img_0_rte_image_92.png

하지만 해당 경로에 가보면 라이브러리 파일이 정상적으로 생성되어 있다.


한번 라이브러리를 생성하면 IDE에게 OpenGL 프로그램을 위한 라이브러리와 include 파일들이 어디 있는지 알려줘야 합니다. 보통 두가지 방법이 있는데:

  1. IDE/컴파일러의 /lib와 /include 폴더를 찾아, GLFW의 include 폴더와 glfw3.lib를 그 곳에 넣어주는 것입니다. 이 방법도 가능하지만 추천드리지 않습니다. 라이브러리와 include 폴더를 찾는 것은 힘들고 IDE/컴파일러를 새로 설치할 때 마다 이 작업을 다시 해야합니다.
  2. 또 다른 (추천하는)방법은 사용자가 원하는 위치에 경로를 만들고 그 곳에 모든 헤더 파일과 라이브러리를 집어넣어서 IDE/컴파일러가 그 곳을 참조하도록 하는 것입니다. 이 방식대로 하면 모든 서드 파티 라이브러리가 한 위치에 있습니다. 하지만 이 방식은 새 프로젝트를 만들 때마다 해당 위치를 IDE에 알려줘야 합니다.

Our first project

우선, 비주얼 스튜디오를 열고 새로운 프로젝트를 만들어주세요. 언어는 c++을 선택하고 빈 프로젝트(Empty Project)를 만들어줍니다. 64-bit로 하기로 했으니 프로젝트 생성이 완료되면 Debug를 x86에서 x64로 바꿔주세요.

rte_image_170.png

이제 첫번째 OpenGL을 위한 작업공간이 만들어졌습니다!

 

Linking

프로젝트에서 GLFW를 사용하려면 라이브러리를 링크해야 합니다. 링커 설정에서 glfw3.lib를 사용하도록 하면 되지만, 서드 파티 라이브러리를 다른 경로에 두었기 때문에 프로젝트는 glfw3.lib를 어디서 찾아야하는지 모릅니다. 따라서 그 경로를 프로젝트에 추가해야 합니다.

 

특정 경로에서 라이브러리와 include 폴더를 찾도록 하려면 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭한 다음 아래 이미지처럼 VC++ Directories를 선택합니다.

rte_image_172.png


이곳에서 자신의 경로를 추가하여 프로젝트에게 어디에서 검색할지 알려줍시다. 빈 칸에 직접 입력하거나 <Edit..> 옵션으로 경로를 찾아볼수도 있습니다. 라이브러리 경로와 include 경로 모두 이런 식으로 하면 됩니다.

article_img_0_rte_image_180.png

여기에서 원하는 만큼 경로를 추가할 수 있으며, IDE가 라이브러리 및 헤더 파일을 검색할 때 해당 경로에서도 검색합니다. GLFW의 include 폴더가 포함되면 <GLFW/..>를 이용하여 GLFW의 모든 헤더 파일을 찾을 수 있습니다. 라이브러리 또한 마찬가지입니다.

rte_image_190.png

그러고나서 라이브러리를 링크하려면 링커에게 라이브러리 이름을 지정해 주어야 합니다. Additional Dependencies 항목에 라이브러리 이름인 glfw3.lib를 추가해 줍니다. 이제부터 우리가 컴파일할 때 GLFW가 링크됩니다.


OpenGL library on Windows

만약 윈도우를 사용하고 있다면 VIsual Studio와 함께 설치되는 opengl32.lib가 제공됩니다. 이 장에선 VS compiler를 사용하므로 링커 설정에 opengl32.lib도 추가해줍시다. OpenGL 라이브러리의 64비트 버전은 32비트 버전과 마찬가지로 opengl32.lib라고 하며, 다소 불행한 이름 입니다.

 

OpenGL library on Linux

리눅스에서는 링커 설정에 -IGL을 추가하여 libGL.so 라이브러리에 링크해야 합니다. 라이브러리를 찾을 수 없다면 Mesa, Nvidia 또는 AMD 개발 패키지를 설치해야 합니다.

 

 

GLFW 및 OpenGL 라이브러리를 모두 링커 설정에 추가했으면 다음과 같이 GLFW의 헤더 파일을 include 할 수 있습니다.

#include <GLFW/glfw3.h>

이것으로 GLFW의 설정 및 구성을 마치겠습니다.


GLAD

아직 다 끝난 것은 아닙니다. 아직 해야할 일이 하나 남았습니다. OpenGL은 실제론 표준/사양일 뿐입니다. 특정한 그래픽 카드에 드라이버 사양을 구현하는 것은 드라이버 제조업체에게 달려 있습니다. OpenGL 드라이버에는 다양한 버전이 있기 때문에 대부분의 함수들의 위치는 컴파일타임엔 알수 없고 런타임에에 검색됩니다. 함수의 위치를 검색하고 나중에 사용할 수 있도록 함수 포인터에 저장하는 것은 개발자의 일입니다. 이 위치를 검색하는 방법은 OS에 따라 다릅니다. 윈도우에서는 다음과 같습니다:

// define the function's prototype
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// find the function and assign it to a function pointer
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// function can now be called as normal
unsigned int buffer;
glGenBuffers(1, &buffer);

보이는 것과 같이 코드는 복잡하고, 아직 선언되지 않은 함수마다 이 작업을 해주는 건 매우 번거롭습니다. 다행히도 이런한 목적의 GLAD라는 유명한 최신 라이브러리가 있습니다.

 

Setting up GLAD

GLAD는 아까 말한 번거로운 작업을 해주는 오픈소스 라이브러리입니다. GLAD는 다른 오픈 소스 라이브러리들과는 살짝 다른 설정법을 갖고있는데요. GLAD는 웹 서비스를 통해 우리가 사용하려는 OpenGL의 버전에 따라 OpenGL의 어떤 함수들을 정의하고 로드하려는지 GLAD에게 알려줄 수 있습니다.

 

GLAD 웹 서비스에 가서, 언어는 c++을 선택하고, API 섹션에서는 OpenGL의 버전을 최소 3.3(우리가 사용하려는 버전입니다. 하지만 더 상위 버전도 괜찮습니다.)으로 선택합니다. 또, pofile은 Core로 두고 Generate a loader 옵션은 선택한 채로 둡니다. 나머지 옵션들은 무시하고 Generate를 눌러줍시다.

 

GLAD가 zip file 하나를 줄텐데, 그 안에는 두개의 include 폴더와 하나의 glad.c 파일이 들어있습니다. 두개의 include 폴더(glad와 KHR)를 여러분의 include 경로에 복사하고, glad.c 파일은 프로젝트에 추가해 줍시다.

 

모든 과정을 진행했다면, 다음과 같이 include 지시문을 추가할 수 있어야 합니다.

#include <glad/glad.h>

컴파일을 해도 아무런 오류가 없어야 하며, 다음 장으로 넘어갈 순간이라는 뜻이기도 합니다. 다음 장에서는 실제로 GLFW와 GLAD를 사용하여 OpenGL 컨텍스트를 설정하고, 창을 생성해 보겠습니다. include 와 라이브러리 경로가 올바르고 링커 설정이 해당 라이브러리와 일치하는지 확인해주세요.


참고: https://learnopengl.com/Getting-started/Creating-a-window

An unhandled error has occurred. Reload 🗙