GLFW(0) - Create a window

不得不說 OpenGL 真的滿難學的。除了資料收集困難對數學及硬體都要有涉略,光是 Google 每個指令背後的細節就花了我一天的時間。

1. Create a new window:

主要套件為 GLAD 及 GLFW。GLAD 負責準備 OpenGL functions,GLFW 設定版本及視窗相關環境。

#include<iostream>
using namespace std;

// 系統不同標頭檔路徑名稱可能不同,這邊是以 Mac 為例
// 這邊有個小坑,glad 要比 glfw3 先不然會報錯
#include<glad/glad.h>
#include<GLFW/glfw3.h>


void resize_callback(GLFWwindow *window, int width, int height) {
    glViewport(0, 0, width, height);
}

void process_input(GLFWwindow* window) {
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
        glfwSetWindowShouldClose(window, true);
    }
}

int main() {
    if (!glfwInit()) {
        cout << "Fail to init glfw" << endl;
        return -1;
    }
    
    // 使用 GLFW 設定參數,使用 OpenGL 3.3
    // GLFW_OPENGL_CORE_PROFILE 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Mac
	
    // 開新的視窗,開不起來的話檢查版本號 MAJOR 跟 MINOR 是否都有設定
    // Mac 需設定 GLFW_OPENGL_FORWARD_COMPAT
    GLFWwindow* window = glfwCreateWindow(800, 600, "Hello GL", NULL, NULL);
    if (window == NULL) {
        cout << "Fail to create window" << endl;
        return -1;
    }
    glfwMakeContextCurrent(window);
    
    // Load GL functions with GLAD
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        cout << "Fail to load proc" << endl;
        return -1;
    }
	
    // 設定 Camera,並利用 while loop 更新每一禎 buffer 及事件
    glViewport(0, 0, 800, 400);
    glfwSetFramebufferSizeCallback(window, resize_callback);
    while(!glfwWindowShouldClose(window)) {
        process_input(window);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

2. Makefile:

因為我不會用 Visual Studio 跟 Xcode,所以效仿 Linux 系統寫個簡單的 makefile。

如果找不到 header 或 lib 可以用 -I 和 -L 新增搜尋的路徑。

TARGET=main.out
LIBS=-lglfw \
	-I/任何你想include的路徑 \
	-L/任何你想link的路徑 \
	-lglad

$(TARGET): main.cpp
	g++ -o $@ $^ $(LIBS)

.PHONY: clean
clean:
	rm $(TARGET)

留言

熱門文章