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