GLFW+GLAD OpenGL Mac開發環境
阿新 • • 發佈:2018-12-09
最近打算好好的學習一下OpenGL 、這篇文章主要記錄通過庫GLFW+GLAD來搭建Mac平臺下的OpenGL開發環境。之前有一篇文章介紹了在Mac下通過GLFW+GLEW的環境,在熟悉一些平臺開發環境以後好像GLAD更加好使,那就整這個環境來學習了。
開發環境:MacOs Sierra 10.12.6 開發工具:Xcode 8.3.3 GLFW庫:glfw3.2.1 OpenGL:opengl3.3
簡介
還是簡單瞭解一下這些庫大概是個啥
GLFW: GLFW是一個專門針對OpenGL的C語言庫,它提供了一些渲染物體所需的最低限度的介面。它允許使用者建立OpenGL上下文,定義視窗引數以及處理使用者輸入。
GLAD 因為OpenGL只是一個標準/規範,具體的實現是由驅動開發商針對特定顯示卡實現的。由於OpenGL驅動版本眾多,它大多數函式的位置都無法在編譯時確定下來,需要在執行時查詢。所以任務就落在了開發者身上,開發者需要在執行時獲取函式地址並將其儲存在一個函式指標中供以後使用。GLAD可以遮蔽平臺之間API的差異。我感覺類似Java的虛擬機器的角色。
配置GLFW
對於GLFW的配置在之前的文章已經有配置了檢視這裡不再重複了。
配置GLAD
開啟GLAD線上服務配置
到網站配置GLAD並且下載壓縮檔案:線上配置
在Xcode中使用
上面已經準備了兩個庫檔案,現在可以開始使用他們了
新建Command Line Tool專案
配置GLFW
- 配置GLFW標頭檔案
- 配置GLFW lib檔案
- 引入GLFW 靜態庫
配置GLAD庫
上面下載了GLAD庫的檔案包,我這裡直接把那幾個檔案拷貝到專案裡面用了,專案結構如下:
程式碼實現
注意把main.m檔案修改為main.mm因為要寫C程式碼在這裡面
//
// main.m
// HelloOpenGL
//
// Created by 葉立民 on 2018/9/10.
// Copyright © 2018年 Lyman. All rights reserved.
//
// System Headers
#include "glad.h"
#include <GLFW/glfw3.h>
// Standard Headers
#include <cstdio>
#include <cstdlib>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);//回撥函式原型宣告
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main(int argc, char * argv[]) {
//初始化GLFW
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif
//建立一個視窗物件
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "FirstGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
//通知GLFW將我們視窗的上下文設定為當前執行緒的主上下文
glfwMakeContextCurrent(window);
//對視窗註冊一個回撥函式,每當視窗改變大小,GLFW會呼叫這個函式並填充相應的引數供你處理
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//初始化GLAD用來管理OpenGL的函式指標
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
//渲染迴圈
while(!glfwWindowShouldClose(window))
{
// 輸入
processInput(window);
// 渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 檢查並呼叫事件,交換緩衝
glfwSwapBuffers(window);//檢查觸發事件
glfwPollEvents(); //交換顏色緩衝
}
//釋放/刪除之前的分配的所有資源
glfwTerminate();
return EXIT_SUCCESS;
}
//輸入控制,檢查使用者是否按下了返回鍵(Esc)
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
// 當用戶改變視窗的大小的時候,視口也應該被調整
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
// 注意:對於視網膜(Retina)顯示屏,width和height都會明顯比原輸入值更高一點。
glViewport(0, 0, width, height);
}