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)
留言
張貼留言