OpenGL探索(1): Xcode下的項(xiàng)目配置

本來(lái)更想在windows下開(kāi)發(fā) 無(wú)奈自己的本本被某人順到國(guó)外去了(吐血)丢烘,

平時(shí)在公司只能用Mac所以有了此文肚医。

本文是對(duì)learnopengl這個(gè)教程的項(xiàng)目配置的引導(dǎo)憎账,因?yàn)闆](méi)有提供Mac下的配置方法拳恋,自己寫(xiě)了下文以備后需和給其他人提供參考。


知識(shí)準(zhǔn)備

OpenGL

先了解一下OpenGL到底是什么采盒。一般它被認(rèn)為是一個(gè)API(Application Programming Interface, 應(yīng)用程序編程接口)软免,包含了一系列可以操作圖形贰军、圖像的函數(shù)植兰。然而份帐,OpenGL本身并不是一個(gè)API,它僅僅是一個(gè)由Khronos組織制定并維護(hù)的規(guī)范(Specification)钉跷。

OpenGL規(guī)范嚴(yán)格規(guī)定了每個(gè)函數(shù)該如何執(zhí)行弥鹦,以及它們的輸出值。至于內(nèi)部具體每個(gè)函數(shù)是如何實(shí)現(xiàn)(Implement)的爷辙,將由OpenGL庫(kù)的開(kāi)發(fā)者自行決定彬坏。

所有版本的OpenGL規(guī)范文檔都被公開(kāi)的寄存在Khronos那里。有興趣的讀者可以找到OpenGL3.3(我們將要使用的版本)的規(guī)范文檔膝晾。如果你想深入到OpenGL的細(xì)節(jié)(只關(guān)心函數(shù)功能的描述而不是函數(shù)的實(shí)現(xiàn))栓始,這是個(gè)很好的選擇。如果你想知道每個(gè)函數(shù)具體的運(yùn)作方式血当,這個(gè)規(guī)范也是一個(gè)很棒的參考幻赚。

狀態(tài)機(jī)

OpenGL自身是一個(gè)巨大的狀態(tài)機(jī)(State Machine):一系列的變量描述OpenGL此刻應(yīng)當(dāng)如何運(yùn)行。OpenGL的狀態(tài)通常被稱(chēng)為OpenGL上下文(Context)臊旭。我們通常使用如下途徑去更改OpenGL狀態(tài):設(shè)置選項(xiàng)落恼,操作緩沖。最后离熏,我們使用當(dāng)前OpenGL上下文來(lái)渲染佳谦。

假設(shè)當(dāng)我們想告訴OpenGL去畫(huà)線段而不是三角形的時(shí)候,我們通過(guò)改變一些上下文變量來(lái)改變OpenGL狀態(tài)滋戳,從而告訴OpenGL如何去繪圖钻蔑。一旦我們改變了OpenGL的狀態(tài)為繪制線段,下一個(gè)繪制命令就會(huì)畫(huà)出線段而不是三角形奸鸯。

當(dāng)使用OpenGL的時(shí)候咪笑,我們會(huì)遇到一些狀態(tài)設(shè)置函數(shù)(State-changing Function),這類(lèi)函數(shù)將會(huì)改變上下文娄涩。以及狀態(tài)使用函數(shù)(State-using Function)窗怒,這類(lèi)函數(shù)會(huì)根據(jù)當(dāng)前OpenGL的狀態(tài)執(zhí)行一些操作。只要你記住OpenGL本質(zhì)上是個(gè)大狀態(tài)機(jī)蓄拣,就能更容易理解它的大部分特性兜粘。


工具集

在我們畫(huà)出出色的效果之前,首先要做的就是創(chuàng)建一個(gè)OpenGL上下文(Context)和一個(gè)用于顯示的窗口弯蚜。然而孔轴,這些操作在每個(gè)系統(tǒng)上都是不一樣的,OpenGL有目的地從這些操作抽象(Abstract)出去碎捺。這意味著我們不得不自己處理創(chuàng)建窗口路鹰,定義OpenGL上下文以及處理用戶(hù)輸入。

幸運(yùn)的是收厨,有一些庫(kù)已經(jīng)提供了我們所需的功能晋柱,其中一部分是特別針對(duì)OpenGL的。這些庫(kù)節(jié)省了我們書(shū)寫(xiě)操作系統(tǒng)相關(guān)代碼的時(shí)間雁竞,提供給我們一個(gè)窗口和上下文用來(lái)渲染。最流行的幾個(gè)庫(kù)有GLUT,SDL碑诉,SFMLGLFW彪腔。在教程里我們將使用GLFW


GLFW

GLFW是一個(gè)專(zhuān)門(mén)針對(duì)OpenGL的C語(yǔ)言庫(kù)进栽,它提供了一些渲染物體所需的最低限度的接口德挣。它允許用戶(hù)創(chuàng)建OpenGL上下文,定義窗口參數(shù)以及處理用戶(hù)輸入快毛,這正是我們需要的格嗅。


構(gòu)建GLFW

GLFW可以從它官方網(wǎng)站的下載頁(yè)上獲取

為了完整性我們將從編譯源代碼開(kāi)始。所以我們需要下載源代碼包唠帝。

如果你要使用預(yù)編譯的二進(jìn)制版本的話屯掖,請(qǐng)下載32位的版本而不是64位的(除非你清楚你在做什么)。大部分讀者反映64位版本會(huì)出現(xiàn)很多奇怪的問(wèn)題襟衰。


用CMake工具編譯下載好的文件

1.選擇源代碼目錄和庫(kù)的生成目錄

2.點(diǎn)擊Configure贴铜,選擇Unix Makefiles(也可以選擇Xcode,然后用Xcode編譯項(xiàng)目) --> Done

3.這里庫(kù)的生成配置使用默認(rèn)設(shè)置右蒲,再次點(diǎn)擊Configure

4.點(diǎn)擊Generate(生成)按鈕阀湿,生成的工程文件會(huì)在你的build文件夾中

CMake配置GLFW

5.在終端進(jìn)入build目錄輸入make,生成libglfw3.a文件在src目錄


GLAD

因?yàn)镺penGL只是一個(gè)標(biāo)準(zhǔn)/規(guī)范瑰妄,具體的實(shí)現(xiàn)是由驅(qū)動(dòng)開(kāi)發(fā)商針對(duì)特定顯卡實(shí)現(xiàn)的陷嘴。由于OpenGL驅(qū)動(dòng)版本眾多,它大多數(shù)函數(shù)的位置都無(wú)法在編譯時(shí)確定下來(lái)间坐,需要在運(yùn)行時(shí)查詢(xún)灾挨。所以任務(wù)就落在了開(kāi)發(fā)者身上,開(kāi)發(fā)者需要在運(yùn)行時(shí)獲取函數(shù)地址并將其保存在一個(gè)函數(shù)指針中供以后使用竹宋。取得地址的方法因平臺(tái)而異劳澄,在Windows上會(huì)是類(lèi)似這樣:...(此文并非MarkDown省略代碼...)

代碼非常復(fù)雜,而且很繁瑣蜈七,我們需要對(duì)每個(gè)可能使用的函數(shù)都要重復(fù)這個(gè)過(guò)程秒拔。幸運(yùn)的是,有些庫(kù)能簡(jiǎn)化此過(guò)程飒硅,其中GLAD是目前最新砂缩,也是最流行的庫(kù)。


GLAD是一個(gè)開(kāi)源的庫(kù)三娩,它能解決我們上面提到的那個(gè)繁瑣的問(wèn)題庵芭。GLAD的配置與大多數(shù)的開(kāi)源庫(kù)有些許的不同,GLAD使用了一個(gè)在線服務(wù)雀监。在這里我們能夠告訴GLAD需要定義的OpenGL版本双吆,并且根據(jù)這個(gè)版本加載所有相關(guān)的OpenGL函數(shù)。

打開(kāi)GLAD的在線服務(wù),將語(yǔ)言(Language)設(shè)置為C/C++好乐,在API選項(xiàng)中匾竿,選擇3.3以上的OpenGL(gl)版本(我們的教程中將使用3.3版本,但更新的版本也能正常工作)曹宴。之后將模式(Profile)設(shè)置為Core搂橙,并且保證生成加載器(Generate a loader)的選項(xiàng)是選中的∏柑幔現(xiàn)在可以先(暫時(shí))忽略拓展(Extensions)中的內(nèi)容笛坦。都選擇完之后,點(diǎn)擊生成(Generate)按鈕來(lái)生成庫(kù)文件苔巨。

GLAD現(xiàn)在應(yīng)該提供給你了一個(gè)zip壓縮文件版扩,包含兩個(gè)頭文件目錄,和一個(gè)glad.c文件侄泽。將兩個(gè)頭文件目錄(gladKHR)復(fù)制到你的Include文件夾中(或者增加一個(gè)額外的項(xiàng)目指向這些目錄)礁芦,并添加glad.c文件到你的工程中。

經(jīng)過(guò)前面的這些步驟之后悼尾,你就應(yīng)該可以將以下的指令加到你的文件頂部了:

#include <glad/glad.h>


項(xiàng)目配置

1.Xcode創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目


macOS Command Line Tool

????這里下一步語(yǔ)言要選擇C++

2.創(chuàng)建include 和 libs目錄 把對(duì)應(yīng)的文件添加進(jìn)項(xiàng)目


目錄和導(dǎo)入的庫(kù)

3.TARGETS -> Build Phases -> Link Binary With Libraries中 把 IOKit,Cocoa,CoreVideo,OpenGL,libglfw3.a 這些庫(kù)添加進(jìn)去

4.TARGETS -> Build Settings -> Header Search Paths中加入include目錄


附加包涵目錄

5.編寫(xiě)main.cpp

代碼點(diǎn)擊這里

6.運(yùn)行項(xiàng)目


運(yùn)行結(jié)果

沒(méi)有使用MarkDown 貼代碼效果不好柿扣,所以省略了。 暫時(shí)先這樣闺魏,以后對(duì)文章進(jìn)行修繕未状。如果文章結(jié)構(gòu)不清晰,或者有坑請(qǐng)?jiān)诨貜?fù)中提示析桥,謝謝司草。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泡仗,隨后出現(xiàn)的幾起案子埋虹,更是在濱河造成了極大的恐慌,老刑警劉巖娩怎,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搔课,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡截亦,警方通過(guò)查閱死者的電腦和手機(jī)爬泥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)魁巩,“玉大人急灭,你說(shuō)我怎么就攤上這事」人欤” “怎么了葬馋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我畴嘶,道長(zhǎng)蛋逾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任窗悯,我火速辦了婚禮区匣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒋院。我一直安慰自己亏钩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布欺旧。 她就那樣靜靜地躺著姑丑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辞友。 梳的紋絲不亂的頭發(fā)上栅哀,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音称龙,去河邊找鬼留拾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲫尊,可吹牛的內(nèi)容都是我干的痴柔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼马昨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竞帽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鸿捧,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屹篓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后匙奴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體堆巧,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年泼菌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍肤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哗伯,死狀恐怖荒揣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焊刹,我是刑警寧澤系任,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布恳蹲,位于F島的核電站,受9級(jí)特大地震影響俩滥,放射性物質(zhì)發(fā)生泄漏嘉蕾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一霜旧、第九天 我趴在偏房一處隱蔽的房頂上張望错忱。 院中可真熱鬧,春花似錦挂据、人聲如沸以清。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玖媚。三九已至婚脱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吟宦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓仔蝌,卻偏偏與公主長(zhǎng)得像瞧挤,于是被迫代替她去往敵國(guó)和親癌刽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子远荠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 版本記錄 前言 OpenGL 圖形庫(kù)項(xiàng)目中一直也沒(méi)用過(guò),最近也想學(xué)著使用這個(gè)圖形庫(kù)宜咒,感覺(jué)還是很有意思,也就自然想著...
    刀客傳奇閱讀 6,111評(píng)論 2 14
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料半醉? 從這篇文章中你...
    hw1212閱讀 12,728評(píng)論 2 59
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí)呆奕,會(huì)觸發(fā)此異常登馒。 O...
    我想起個(gè)好名字閱讀 5,320評(píng)論 0 9
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,156評(píng)論 25 707
  • 上個(gè)月買(mǎi)了本《小王子》寄給了小表妹雯雯辜窑,一同寄去的還有一本清新素雅的藍(lán)色帶鎖日記本寨躁,日記本是我曾經(jīng)答應(yīng)要送她的畢業(yè)...
    藍(lán)小巫閱讀 326評(píng)論 2 3