ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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함수를 호출해 보도록 하겠습니다!

    댓글

Designed by Tistory.