-
OpenGL 4.5 강좌 - (3) 창 띄우기OpenGL 2021. 1. 31. 15:04
지금까지의
main.cpp
는 glfw와 glad를#include
하는 것 말고는 텅 비었는데요, 이제 무언가를 하는 코드를 작성해 봅시다!우선 glfw 라이브러리를 사용하기 전에
glfwInit()
함수를 통해 초기화를 해주어야 합니다. 초기화에 성공했다면 GLFW_TRUE값을, 실패했다면 GLFW_FALSE (=0) 값을 리턴하므로 에러 체크도 해 줍니다. 메인 함수에 아래 코드를 추가해 줍시다.if (!glfwInit()) { std::cerr << "GLFW Initialization Failed!\n"; return -1; }
또 프로그램이 끝나기 전에
glfwTerminate();
를 호출해야 합니다. 이 함수를 호출한 후에는 glfw 함수를 더이상 호출할 수 없으므로 프로그램 맨 끝에 놓아둡시다.glfwTerminate();
GLFW를 초기화한 후 우리가 사용할 OpenGL의 버전을 아래와 같이 GLFW에 전달해 주어야 합니다. 우리는 OpenGL 4.5를 사용할 것이기 때문에 메이저 버전에 4, 마이너 버전에 5를 전달해 줍시다. 또 OpenGL 이전 버전의 오래된 기능을 사용할 건지 안 할 건지를 설정해주는 GLFW_OPENGL_PROFILE은 당연히 사용안함 (GLFW_OPENGL_CORE_PROFILE)으로 설정해주셔야 합니다.
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
이제 창을 띄워 봅시다. 창은
glfwCreateWindow()
함수를 통해 띄울 수 있습니다. 첫째 인자는 창의 가로 크기, 둘째 인자는 창의 세로 크기이고, 셋째 인자는 창의 타이틀입니다. 리턴값인window
는 창을 가리키는 핸들입니다. 만약 창을 띄우는 데 실패했다면 NULL 포인터가 리턴됩니다.GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL); if (!window) { std::cerr << "Create Window Failed!\n"; glfwTerminate(); return -1; }
창을 닫으려면
glfwDestroyWindow()
함수를 사용합니다.glfwDestroyWindow(window);
생성된 창에서 OpenGL을 사용하려면 창에 OpenGL Context(맥락)을 생성하고, glad를 통해 OpenGL함수 포인터들을 로딩해야 합니다. 아래 코드를 추가해 줍시다.
glfwMakeContextCurrent(window); gladLoadGL();
이렇게까지 하고 실행하면, 창이 뜨지 않습니다. (...) 그 이유는 창을 생성하자마자 프로그램이 종료되어 닫혀 버리기 때문입니다. 따라서 이벤트 루프 (Event Loop) 또는 렌더 루프 (Render Loop)를 돌면서 프로그램이 바로 종료되지 않도록 해야 합니다.
while (!glfwWindowShouldClose(window)) { // TODO glfwPollEvents(); }
glfwWindowShouldClose()
는 사용자가 창을 닫으라는 명령을 했는지(창 닫기 버튼 (X) 클릭, Alt+F4 단축키 등)를 받아오는 함수이고,glfwPollEvents()
는 사용자의 입력을 기다려주는 함수입니다. 따라서 위 코드는 무한 루프를 돌면서 사용자가 무슨 입력을 할 때까지 기다린 다음, 만약 창을 닫으라는 명령이 들어온다면 루프를 탈출하는 코드입니다.이제 실행하면 텅 빈 창이 뜰 것입니다.
여기까지의 전체 코드:
#define GLFW_INCLUDE_NONE #include <GLFW/glfw3.h> #include <glad/glad.h> int main() { if (!glfwInit()) { // Initialization failed return -1; } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); gladLoadGL(); while (!glfwWindowShouldClose(window)) { // TODO glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0; }
다음 강부터는 본격적으로 OpenGL함수를 호출해 보도록 하겠습니다!
'OpenGL' 카테고리의 다른 글
OpenGL 4.5 강좌 - (5) VAO, VBO (2) 2021.01.31 OpenGL 4.5 강좌 - (4) Framebuffer, 더블 버퍼링, V-Sync (0) 2021.01.31 OpenGL 4.5 강좌 - (2) 개발환경 셋팅하기 (0) 2021.01.31 OpenGL 4.5 강좌 - (1) OpenGL 소개: C언어로 화면에 그림 그리기 (2) 2021.01.31