멋진 그래픽을 만들기 위해 우리가 첫번째로 해야 할 것은 OpenGL Context를 만들고 안에다 Application Window를 만드는 것이다. 그러나 이러한 연산은 운영체제마다 다르고, OpenGL은 이것을 추상화한다. 이것은 우리가 스스로 윈도우를 만들고, Context를 정의하고, 사용자 입력을 직접 처리해야 한다는 것을 의미한다.

운이 좋게도 우리가 찾는 기능을 제공하는 라이브러리들이 있다. 그러한 라이브러리들은 우리에게 모든 운영체제의 특수한 작업을 도와주고, window와 렌더링할 OpenGL Context를 제공해준다. 인기있는 라이브러리는 GLUT, SDL, SFML, GLFW가 있다. 이 튜토리얼에서는 GLFW를 사용할 것이다.

GLFW

GLFW는 OpenGL을 대상으로 하는 C로 작성된 라이브러리이다. GLFW는 화면에 오브젝트를 렌더링하는 데 필요한 것들을 제공해준다. 이를 통해 OpenGL Context를 생성하고, Window Parameter를 정의하고, 필요한 사용자 입력을 다루는 것을 허용한다.

이번 튜토리얼의 핵심은 GLFW를 구동시키고, 그것을 이용하여 OpenGL Context를 만들고 우리가 렌더링할 윈도우를 만들어 출력하는 것이다. 이번 튜토리얼에서는 Microsoft Visual Studio 2015 IDE를 사용할 것이다.(나는 2019을 사용할 것이지만)

Building GLFW

GLFW는 라이브러리 웹페이지의 다운로드 페이지에서 받을 수 있다.(링크: https://www.glfw.org/) 이 웹페이지에서 미리 컴파일된 바이너리와 헤더파일을 얻을 수 있지만, 우리는 완벽함을 위해서 GLFW를 소스코드로부터 컴파일할 것이다. 그래서 소스코드 패키지를 다운받아보자.

<aside> 💡 경고: 만약 pre-compiled binaries를 사용한다면 64bit가 아닌 32bit 버전을 다운받도록 해야한다. 64bit 버전은 대부분의 사용자들에게 이상한 에러를 일으키고 있다.

</aside>

(라고 튜토리얼은 말하지만 저는 그냥 컴파일된 바이너리파일과 헤더파일을 다운받아 사용했습니다. 이 부분은 생략)

GLAD

OpenGL은 표준이자 명세이기 때문에 특정한 그래픽카드가 지원하는 드라이버에 대한 명세를 구현하는 것은 드라이버 제조사에 달려있다. OpenGL 드라이버들은 많은 다른 버전이 있기 때문에 대부분의 함수들의 위치는 컴파일-타임에서 알려지지 않는다. 런-타임에 query될 필요가 있다. 그러고 개발자가 사용하기 위해 함수 포인터에서 그것들을 저장하는 함수들의 위치를 가져오는 것은 개발자의 일이다. 그러한 위치를 불러오는 방법은 OS마다 다르며, 윈도우에서는 다음과 같다

<aside> 💡 // 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);

</aside>