本來(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碑诉,SFML和GLFW彪腔。在教程里我們將使用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文件夾中
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è)頭文件目錄(glad和KHR)復(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)目
????這里下一步語(yǔ)言要選擇C++
2.創(chuàng)建include 和 libs目錄 把對(duì)應(yīng)的文件添加進(jìn)項(xiàng)目
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
6.運(yùn)行項(xiàng)目
沒(méi)有使用MarkDown 貼代碼效果不好柿扣,所以省略了。 暫時(shí)先這樣闺魏,以后對(duì)文章進(jìn)行修繕未状。如果文章結(jié)構(gòu)不清晰,或者有坑請(qǐng)?jiān)诨貜?fù)中提示析桥,謝謝司草。