01. 개발환경 세팅과 윈도우 열기
목차
- 주의사항
- OpenGL 개발 권장 사양
- 사용할 언어 / 라이브러리
- GLFW 윈도우 열기
주의사항
- 이 지식의 구렁텅이의 OpenGL 코스에 올라오는 코드들은 모두 Windows 11에서 검증이 완료된 코드입니다.
- Windows + Visual Studio 26이 아닌 타 플랫폼에 대한 설명은 적지 않습니다.
- 자세한 검증용 PC 스펙은 아래를 참고해주세요.
- 운영체제 : Windows 11
- CPU : Intel Core i7 13650HX
- 그래픽카드 : GeForce RTX 5060 Laptop
- RAM : DDR5 32GB
OpenGL 개발 권장 사양
GL은 벌칸과 다르게 매우 오랫동안 사용된 규격이라서 웬만한 드라이버는 다 지원하지만,
중요한 점은 이 코스에서는 DSA (Direct State Access)라는 기능을 사용할 것이고,
DSA 기능은 OpenGL 4.5 부터 정식으로 지원됩니다.
따라서 자신의 그래픽카드가 OpenGL 4.5 이상을 지원하는지 꼭 확인해주세요.
또 RAM은 클수록 좋지만, 그래픽스 개발에 최소 16GB 는 확보하시는 것을 추천드립니다.
마지막으로 혹시 Nvidia 제품군을 사용하신다면,
NVIDIA 제어판 - 3D 설정 관리 - OpenGL GDI 호환성 을 호환 선호 로 설정해주세요.
이에 대해서는 3. 윈도우 입력과 OpenGL 에서의 멀티스레딩 에서 재차 언급하겠습니다.
사용할 언어 / 라이브러리
이 코스에서는 기본적으로 C++ 20을 사용합니다.
C++ 20에만 있는 기능(span, ranges, concepts, coroutine 등) 들을 주로 사용하진 않지만, 가끔 등장할 예정입니다.
사용할 라이브러리는 다음과 같습니다.
(사용 방법을 알고 있다면 GLFW대신 SDL / SFML / RGFW, GLAD 대신 GLEW, GL3W나 커스텀 로더 등을 써도 무관합니다.)
위의 라이브러리 파일들을 타겟 플랫폼 (x64 / x86) 과 원하는 링킹 형태를 고려해서 사전에 받아놔 주세요.
GLAD의 경우 API 항목에 gl을 Version 4.6 으로, Profile 항목을 Core 를 선택한 채로 받아 주세요.
현재 당장 필요한 라이브러리는 GLFW, GLAD 2개 뿐입니다.
나머지들은 중간에 소개와 함께 차근차근 사용하도록 하겠습니다.
GLFW 윈도우 열기
GLFW란?
GLFW는 OpenGL 개발에 필요한 창 열기 와 이벤트 핸들링 을 크로스 플랫폼으로 추상화해주는 라이브러리입니다.
GLFW/glfw3.h 헤더를 통해서 크로스 플랫폼 GLFW 기능들을 모두 사용할 수 있고,
GLFW/glfw3native.h 헤더에선 GLFW_EXPOSE_NATIVE_WIN32 같은 매크로를 정의해서 HWND 같은 플랫폼 독립적인 핸들을 가져와 쓸 수 있습니다.
게임 엔진을 개발할 것이 아니라면, GLFW에 대해서는 창을 나타내는 GLFWwindow 와 그에 따른 함수 몇 개만 알고 있으면 충분합니다.
꼭 필요한 함수들은 다음과 같습니다.
// GLFW를 초기화. 프로그램 시작할때 한 번 부른다.
void glfwInit();
// GLFW 창을 생성.
GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);
// window에 대한 GL Context 를 현재 스레드로 설정
void glfwMakeContextCurrent(GLFWwindow* window);
// 사용자가 window를 닫으려고 했는지 반환
int glfwWindowShouldClose(GLFWwindow* window);
// window의 두 버퍼를 교체
void glfwSwapBuffers(GLFWwindow* window);
// GLFW내에 쌓인 전역 이벤트들을 전송
void glfwPollEvents();
// GLFW 창을 삭제.
void glfwDestroyWindow(GLFWwindow* window);
// GLFW를 종료. 프로그램 종료할 때 한 번 부른다.
void glfwTerminate();
GL Context와 더블 버퍼링, 이벤트 전송에 대한 자세한 내용은 3. 윈도우 입력과 OpenGL 에서의 멀티스레딩 에서 확인해 주세요.
GLAD란?
위에서 언급했다시피, OpenGL은 '라이브러리' 가 아니라, 규격이고, 드라이버 안에 사양대로 정의되어 있습니다. 그래서 저희가 쓸 OpenGL 기능(=이름이 gl로 시작하는 함수들의 위치)들을 런타임에 불러와야 합니다.
그 수고를 덜어주는 라이브러리가 GLAD입니다. 밑의 함수 2개만 알고 계시면 됩니다.
// 현재 스레드에 GL Context 가 설정되어 있다는 가정 하에,
// 현재 스레드에 GL 함수들을 로딩 (실패 시 0 반환)
int gladLoadGL();
// 인자로 받은 프로시저를 기반으로 GL함수들을 로딩 (실패 시 0 반환)
int gladLoadGLLoader(GLADloadproc proc);
예제 실행하기
아래 코드를 복사한 후, 실행했을 때 창이 잘 열리고 닫히는지 확인해 주세요.
#include <glad/glad.h>
#include <glfw/glfw3.h>
#include <cassert>
int main() {
glfwInit(); // GLFW 초기화
// 창 생성
GLFWwindow* window = glfwCreateWindow(1280, 720, "OpenGL", nullptr, nullptr);
// 현재 스레드에 GL Context 설정
glfwMakeContextCurrent(window);
// GL 함수 로딩
assert(gladLoadGL() != 0);
// 사용자가 창을 닫을 때까지
while (glfwWindowShouldClose(window) == false) {
// 전역 이벤트들을 전송
glfwPollEvents();
// 버퍼 교체
glfwSwapBuffers(window);
}
// 창 삭제
glfwDestroyWindow(window);
glfwTerminate(); // GLFW 종료
}
OpenGL 이란 이름의 창이 뜨면 성공입니다.
만약 컴파일이 안 된다면 라이브러리 링커를 확인해보시고,
런타임에 에러가 난다면 GLAD 설정 관련일 가능성이 높으니 GLAD 설정을 다시 확인해주세요.
다음 게시글에서는 그래픽스 프로그래밍에서의 Hello, world라고 할 수 있는 삼각형을 출력해보겠습니다.