保姆級教學!Xcode 配置 OpenGL 環境

文章目錄

  • GLFW
    • 獲取 GLFW
  • GLAD
    • 獲取 GLAD
  • 在 Xcode 中配置下載好的 GLFW 和 GLAD
    • 配置流程
    • 檢測是否配置成功
  • 無關配置的題外話——Xcode 下安全的刪除移動操作


GLFW

Graphics Library Framework(圖形庫框架),可以讓我們通過其封裝好的 通用API 來正確創建 OpenGL context(上下文) 并顯示出一個簡單的 窗口

如果沒有這個跨平臺工具,那么我們在 windows 上創建 OpenGL窗口 時需要調用顯卡中提供的 windows 使用的 API,而在 Mac 上創建窗口時需要 MacOS 的 API。

獲取 GLFW

從官網上下載GLFW macOS下64位二進制文件

請添加圖片描述


GLAD

因為 OpenGL 只是一個標準/規范,驅動開發商針對不同顯卡有不同的具體實現,導致 OpenGL 驅動版本過于龐雜,大多數函數的位置都無法在編譯時確定下來,需要在運行時查詢。 因此開發者需要在運行時獲取函數地址并將其保存在一個函數指針中供以后使用。

這里來看一個 LearnOpenGL CN 中所舉的 Windows 下獲取函數地址的例子:

// 定義函數原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正確的函數并賦值給函數指針
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 現在函數可以被正常調用了
GLuint buffer;
glGenBuffers(1, &buffer);

對于開發人員而言,每使用一個函數就要經歷這樣的尋址過程無疑是極其痛苦的,因此需要通過 GLAD 庫加載所有OpenGL函數指針,來簡化使用函數的流程。

獲取 GLAD

打開 GLAD 的在線服務:

  • Language 設置為 C/C++
  • API 選項中,選擇 3.3 以上的 OpenGL(gl)版本(更新的版本也能用);
  • 之后將 模式(Profile) 設置為Core
    • Compatibility 兼容舊版本,包含低版本中的 API 。
    • Core 只包含當前版本必須支持的 API ,不考慮向下兼容舊版本,更為輕巧。
  • 選中 生成加載器(Generate a loader) 選項。
  • 可以先(暫時)忽略 擴展(Extensions) 中的內容。
  • 點擊 生成(Generate) 按鈕來生成庫文件。

請添加圖片描述

下載得到一個 zip 壓縮文件,包含兩個頭文件目錄,里面分別放著一個和目錄同名的 .h 文件,和一個放著 glad.c 文件的 src 目錄:
在這里插入圖片描述


在 Xcode 中配置下載好的 GLFW 和 GLAD

配置流程

  1. 新建項目。

請添加圖片描述

  1. 選擇 Command Line Tool

請添加圖片描述

  1. 項目名稱隨便起,這里我起名為 OpenGL

請添加圖片描述

  1. 項目所在位置自己選擇,不影響后續配置。

請添加圖片描述

  1. 接下來通過如圖所示流程配置 Header Search Paths(頭文件搜索路徑)。【當然,初次配置時 Header Search Paths 對應的路徑為空,圖中路徑不為空是因為我配置好了】:

在這里插入圖片描述

  1. 雙擊紅框中標注的地方,從訪達中拖拽下載好的 glad/include文件夾glfw-3.3.7.bin.MACOS/include文件夾 到彈出的方框中(對于這兩個文件夾在訪達中的所在位置,你可能與我不一樣,因此按照你自己放置的路徑來配置即可),配置頭文件搜索路徑:

在這里插入圖片描述
拖動添加:
在這里插入圖片描述

  1. main.cpp 文件中添加以下代碼,注意添加時兩個 include 語句的順序不能改變
#include <glad/glad.h>
#include <GLFW/glfw3.h>

請確認是在包含 GLFW 的頭文件之前包含了 GLAD 的頭文件。GLAD 的頭文件包含了正確的 OpenGL 頭文件(例如GL/gl.h),所以需要在其它依賴于 OpenGL 的頭文件之前包含 GLAD。

  1. 點擊運行按鈕(紅框標注),提示構建成功,則表明頭文件搜索路徑添加成功,已經可以使用 GLFW 和 GLAD 的頭文件:

在這里插入圖片描述

  1. 根據下圖順序查看三個文件是否分別被添加進黃框所示部分,即可核驗是否成功鏈接(Link)添加的文件 libglfw3.alibglfw3.dylib(靜態庫、動態庫兩者添加其一即可),以及 glad.c 是否參與編譯:
    在這里插入圖片描述
  2. 最好加上這兩個框架,Xcode有可能會報框架缺失的錯誤,點“+”搜索名字添加即可:
    在這里插入圖片描述

檢測是否配置成功

將下面的代碼復制到 main.cpp 中并運行,如果能彈出一個墨綠色的窗口即證明配置成功。

以下代碼源于 LearnOpenGL CN的創建窗口 ,代碼中注釋不夠細致,如果不懂可以閱讀文檔了解更多。

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// 對窗口注冊一個回調函數(Callback Function),它會在每次窗口大小被調整的時候被調用。
// 參數:window - 被改變大小的窗口,width、height-窗口的新維度。
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// 改變視口大小的函數glViewport(0, 0, width, height);
}// 實現輸入控制的函數
void processInput(GLFWwindow *window)
{// glfwGetKey兩個參數:窗口,按鍵// 沒有被按下返回 GLFW_PRESSstd::cout << "是否點擊ESC?" << std::endl;std::cout << glfwGetKey(window, GLFW_KEY_ESCAPE) << std::endl;if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)// 被按下則將 WindowShouldClose 屬性置為 true// 以便于關閉 渲染循環glfwSetWindowShouldClose(window, true);
}int main()
{glfwInit(); // 初始化GLFW// glfwWindowHint函數的第一個參數代表選項的名稱// 第二個參數接受一個整型,用來設置這個選項的值// 將主版本號(Major)和次版本號(Minor)都設為3glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 使用的是核心模式(Core-profile)glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);// 參數依次為:寬、高、窗口的名稱,顯示器用于全屏模式,設為NULL是為窗口// 窗口的上下文為共享資源,NULL為不共享資源GLFWwindow* window = glfwCreateWindow(800, 600, "FirstWindow", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;// 釋放空間,防止內存溢出glfwTerminate();return -1;}// 創建完畢之后,需要讓window的context成為當前線程的current contextglfwMakeContextCurrent(window);// glfwGetProcAddress是glfw提供的用來加載 系統相關的OpenGL函數指針地址 的函數// 用gladLoadGLLoader函數根據使用者的系統定義了正確的函數if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 告訴OpenGL渲染窗口的尺寸大小,即視口(Viewport)// 這樣OpenGL才只能知道怎樣根據窗口大小顯示數據和坐標// 調用glViewport函數來設置窗口的維度(Dimension)// 前兩個參數控制窗口左下角的位置。第三個和第四個參數控制渲染窗口的寬度和高度(像素)glViewport(0, 0, 800, 600);// 窗口大小改變時視口也要隨之改變,這通過對窗口注冊 framebuffer_size_callback 實現。// 它會在每次窗口大小被調整時調用glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);/* 渲染循環(Render Loop) */// glfwWindowShouldClose 檢查一次GLFW是否被要求退出// 為true時渲染循環結束while(!glfwWindowShouldClose(window)){// 監測鍵盤輸入processInput(window);/* 渲染 */// 狀態設置函數,設置清空屏幕所用的顏色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 狀態使用函數,使用設定好的顏色來清除舊的顏色緩沖glClear(GL_COLOR_BUFFER_BIT);// 上面兩種函數起到的作用也可以用 glClearBufferfv 來現實/*GLfloat color[] = {0.2, 0.3, 0.3, 1.0};glClearBufferfv(GL_COLOR, 0, color);*/// glfwSwapBuffers 交換顏色緩沖,用來繪制并作為輸出顯示在屏幕glfwSwapBuffers(window);// glfwPollEvents 檢查是否有觸發事件glfwPollEvents();}glfwTerminate();return 0;
}

運行結果:
在這里插入圖片描述


無關配置的題外話——Xcode 下安全的刪除移動操作

接下來要講的一點與配置關系不大,但是也給初使用 Xcode 的我帶來了不小的麻煩。不同于 Windows 下的操作習慣,在 macOS 中盡量在訪達中對文件進行移動、刪除等操作,而非直接拖拽到 Xcode 的樹形目錄中進行移動,亦或直接在樹形目錄中進行刪除。舉個例子:

  1. 比如在當前項目(OpenGL)的同級目錄下我新建了一個 test 文件夾,并且其中有文件 test.sh

請添加圖片描述
請添加圖片描述

  1. 而后我將它通過訪達拖拽移動到 OpenGL 目錄下:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  1. 此時如果通過 Xcode 樹形目錄進行刪除:

在這里插入圖片描述

  1. 會詢問刪除方式,兩種方式的區別詳見本篇文章:

在這里插入圖片描述

  • Move to Trash刪除文件內容到廢紙簍(此時的文件內容不在工程中,但是文件夾還是會在工程中):

刪除前:
在這里插入圖片描述

刪除后:
在這里插入圖片描述

  • Reremove reference移除文件的引用(只是刪除引用,文件內容都還在工程中),后續如果添加相同文件會彈出“要添加的文件已存在”的報錯提示,需要在訪達中將上次僅刪除引用的文件完全刪除。

刪除前同上。
刪除后:
在這里插入圖片描述

  • 不論是 Reremove reference 還是 Move to Trash 他們的文件夾都會在工程中(如果沒有清除,下次添加重名的工程文件會彈出警告)。

PS:還遇到過刪除 OpenGL 目錄下的 test 文件夾,結果導致與 OpenGL 同級的 test 文件夾也被刪除的情況,但后來無法復現,因此在這里無法貼圖證明。總而言之,對 macOS 使用尚不熟練時,盡量使用訪達對文件進行移動刪除操作(通過拖拽獲得文件路徑是簡單且安全的方法,可以使用),即使是對 Xcode 樹形目錄進行操作也請盡可能通過 Show in Finder 跳轉到訪達中,以避免出現不必要的錯誤與文件損失。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443683.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443683.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443683.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android入門(17)| 百度提供的 Android定位SDK

文章目錄配置百度提供的 Android定位SDK用于發布的 SHA1用于測試的 SHA1使用百度定位實例配置百度提供的 Android定位SDK 詳情參見官方文檔&#xff0c;這里僅對獲取 SHA1 做詳細介紹&#xff1a; 用于發布的 SHA1 用于測試的 SHA1 使用百度定位實例 public class LocationAc…

ios 不被遮擋 陰影_為何你沒見到日環食?你不知道的天象常識原來還有這么多 | 返樸...

關注風云之聲提升思維層次導讀說好的日環食呢&#xff0c;為什么上周很多人只等到了日偏食?日食月食的時間和種類是怎么預測的?你真的弄懂了各種日食和月食的成因嗎&#xff1f;你了解它們有什么區別和聯系&#xff0c;又遵循什么樣的時間規律嗎? 日食和月食發生的頻率一樣嗎…

初識貝塞爾(bezier)曲線

文章目錄資料援引貝塞爾曲線的用途一階貝塞爾&#xff08;bezier&#xff09;曲線二階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾&#xff08;bezier&#xff09;曲線高階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾曲線求插值&#xff08;Slerp&#xff09…

python代碼測試 vim_用 Hypothesis 快速測試你的 Python 代碼

點擊上方“Python編程時光”&#xff0c;選擇“加為星標”第一時間關注Python技術干貨&#xff01;介紹無論你使用哪種編程語言或框架&#xff0c;測試都非常重要。Hypothesis是 Python 的一個高級測試庫。它允許編寫測試用例時參數化&#xff0c;然后生成使測試失敗的簡單易懂…

Mac 下 CMake 的配置與使用

文章目錄安裝與配置編譯單個源文件編譯前的準備開始編譯編譯多個源文件多個源文件在同一目錄下多個源文件在不同目錄下math 目錄下的 CMakeLists.txt根目錄的 CMakeLists.txtoption 選項導入外部庫本地導入&#xff08;find_package&#xff09;外部導入&#xff08;FetchConte…

五軸編程_沙井萬豐數控數控編程五軸編程那個軟件好用

沙井萬豐數控數控編程五軸編程那個軟件好用設計需要掌握很高很全面的知識和技能&#xff0c;模具做的好&#xff0c;產品質量好&#xff0c;模具結構合理&#xff0c;生產效率高&#xff0c;工廠效益好。正因如此&#xff0c;模具技術工在外打工的工資都非常的高。少則每月幾千…

Linux學習:第二章-Linux安裝

一虛擬機使用 VMware主要特點&#xff1a; 1、不需要分區或重新開機就能在同一臺PC上使用兩種以上的操作系統 2、本機系統可以與虛擬機系統網絡通信 3、可以設定并且隨時修改虛擬機操作系統的硬件環境 二安裝方式 圖形安裝&#xff1a;直接回車 字符安裝&#xff1a;linux tex…

keil3如何放大字體_國潮海報不會做?送你國風字體+圖案筆刷+PSD素材+包裝樣機...

有很多朋友都問帶魚&#xff0c;國潮風的海報到底應該怎么做呢&#xff1f;首先你要知道什么是國潮風&#xff1a;國潮風就是現代文化和古代文化的碰撞&#xff0c;是年輕人的態度&#xff01;那么應該如何構圖如何設計呢&#xff1f;如何配色如何搭配字體呢&#xff1f;這些方…

Google 開源項目風格指南學習筆記——C++篇

文章目錄前言0. 縮寫名詞解釋1. 頭文件1.1. Self-contained 頭文件1.2. 頭文件保護1.3. 前置聲明1.4 內聯函數1.5. #include 的路徑及順序2. 作用域2.1. 命名空間2.2. 非成員函數、靜態成員函數和全局函數2.3. 局部變量2.4. 靜態和全局變量3. 類3.1. 構造函數的職責3.2. 隱式類…

hiveserver2啟動不起來_給愛車配個充電寶,70邁汽車應急啟動電源,讓你遠離搭電小廣告...

說到汽車應急啟動其實我有切身的痛&#xff0c;在哈爾濱零下35的嚴冬&#xff0c;晚上帶著女神吃完飯&#xff0c;高高興興地吃完以后一上車&#xff0c;發現電瓶被凍沒電了&#xff0c;天知道當時有多尷尬。馬上叫了保險公司過來給搭電&#xff0c;結果在飯店從晚上8點一直等到…

Windows 下 VS 配置 OpenGL 環境

文章目錄前言獲取 GLFW打開 VS前言 感謝B站同學搬運YouTube上的教學視頻。 獲取 GLFW 從官網上下載GLFW macOS下64位二進制文件 打開 VS 新建解決方案 OpenGL test&#xff0c;并在解決方案中新建文件夾 Dependencies&#xff1a; 從下載好的 glfw 文件夾中找到最新版鏈接…

ubuntu 網卡雙網口 配置_無線網卡m2 ngff keya keye、minipcie接口改轉多口有線網卡實現軟路...

小型主板及筆記本中的無線網卡m2ngffkeyakeye接口&#xff08;CNVI除外&#xff09;通過m2ngffkeyae轉接pcie1x轉接板&#xff0c;或者無線網卡的minipcie接口&#xff0c;通過minipcie轉接pcie1x轉接板可以改裝有線網卡板卡&#xff0c;來實現軟路由功能。m2ngffkeyae轉接pcie…

OpenGL | 通過繪制一個三角形來入門 OpenGL 圖形渲染管線

文章目錄前言什么是 OpenGl &#xff1f;回顧openGL 的 Object顯存結構工作階段通過頂點緩沖對象將頂點數據初始化至緩沖中標準化設備坐標頂點緩沖對象 VBOglGenBuffersglBindBufferglBufferData建立了一個頂點和一個片段著色器著色器是什么&#xff1f;為什么需要使用著色器&a…

javascript特效_如何在網頁添加鼠標點擊特效

經常有同學問我怎么做到的&#xff0c;本論壇屬于DZ當然用的是插件啦。偶然在網上找到一個關于wordpress的特效代碼&#xff0c;分享給大家。WordPress 添加鼠標點擊特效實際上這種教程在網上搜索一下有一大堆&#xff0c;已經是各大博主玩爛的東西了。不過既然給自己的博客加上…

Android |雙鎖單例模式中使用Context如何避免內存泄露的 Warning 提示

文章目錄問題解決方法拓展問題 在Android開發中&#xff0c;經常會將工具類以單例模式的方法實現&#xff0c;而工具類中又總不可避免的用到 Context &#xff0c;例如&#xff1a; public class MySingleton {private static volatile MySingleton instance;private final C…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索與實踐

Flutter作為一種全新的響應式、跨平臺、高性能的移動開發框架&#xff0c;在性能、穩定性和多端體驗一致上都有著較好的表現&#xff0c;自開源以來&#xff0c;已經受到越來越多開發者的喜愛。但是&#xff0c;Flutter的引入往往帶來包體積的增大&#xff0c;給很多研發團隊帶…

Linux學習:第三章-Linux常用命令-1

提示符&#xff1a; [rootlocalhost ~]# [登錄用戶名主機名 當前所在目錄]提示符 ~家目錄 /root /home/aa 提示符&#xff1a; #超級用戶 $普通用戶 一 linux命令的格式1、命令 [選項] [參數]lslist顯示目錄下內容 ①命令名稱&#xff1a;ls 命令英文原意&#xff1a;list 命令…

Leetcode每日一題:使括號有效的最少添加(括號匹配)

文章目錄題目解析貪心趣解題目 只有滿足下面幾點之一&#xff0c;括號字符串才是有效的&#xff1a; 它是一個空字符串&#xff0c;或者它可以被寫成 AB &#xff08;A 與 B 連接&#xff09;, 其中 A 和 B 都是有效字符串&#xff0c;或者它可以被寫作 (A)&#xff0c;其中 …

yolov5搭建環境_Yolov5環境配置和訓練私有數據,YOLOv5,以及,私人

1.使用anaconda安裝python3.8的環境conda create -n yolo5 python3.8#anaconda下載地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/2.安裝pytorch1.6 torchvision0.7conda install pytorch1.6 torchvision0.7 cudatoolkit10.13.安裝相關包pip install opencv-py…

sam格式的結構和意義_各種格式的練字本,對寫字真有幫助嗎

圖片來源于筆勢通各種格式的練字本現在越來越多&#xff0c;目的主要是便于學生把握好筆畫的位置和布局&#xff0c;從而把整個字的結構處理好&#xff0c;常見的有米字格&#xff0c;回宮格等。這些練字本對于初學者來說肯定是有幫助的&#xff0c;特別是低年級學生。當然隨著…