發(fā)布時(shí)間:2024-06-28 10:49:10 瀏覽量:149次
在開(kāi)始這段旅程之前我們先了解一下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ā)者自行決定(譯注:這里開(kāi)發(fā)者是指編寫(xiě)OpenGL庫(kù)的人)。因?yàn)镺penGL規(guī)范并沒(méi)有規(guī)定實(shí)現(xiàn)的細(xì)節(jié),具體的OpenGL庫(kù)允許使用不同的實(shí)現(xiàn),只要其功能和結(jié)果與規(guī)范相匹配(亦即,作為用戶不會(huì)感受到功能上的差異)。
實(shí)際的OpenGL庫(kù)的開(kāi)發(fā)者通常是顯卡的生產(chǎn)商。你購(gòu)買(mǎi)的顯卡所支持的OpenGL版本都為這個(gè)系列的顯卡專(zhuān)門(mén)開(kāi)發(fā)的。當(dāng)你使用Apple系統(tǒng)的時(shí)候,OpenGL庫(kù)是由Apple自身維護(hù)的。在Linux下,有顯卡生產(chǎn)商提供的OpenGL庫(kù),也有一些愛(ài)好者改編的版本。這也意味著任何時(shí)候OpenGL庫(kù)表現(xiàn)的行為與規(guī)范規(guī)定的不一致時(shí),基本都是庫(kù)的開(kāi)發(fā)者留下的bug。
由于OpenGL的大多數(shù)實(shí)現(xiàn)都是由顯卡廠商編寫(xiě)的,當(dāng)產(chǎn)生一個(gè)bug時(shí)通??梢酝ㄟ^(guò)升級(jí)顯卡驅(qū)動(dòng)來(lái)解決。這些驅(qū)動(dòng)會(huì)包括你的顯卡能支持的最新版本的OpenGL,這也是為什么總是建議你偶爾更新一下顯卡驅(qū)動(dòng)。所有版本的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è)很棒的參考。
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管線),這個(gè)模式下繪制圖形很方便。OpenGL的大多數(shù)功能都被庫(kù)隱藏起來(lái),開(kāi)發(fā)者很少有控制OpenGL如何進(jìn)行計(jì)算的自由。隨著時(shí)間推移,規(guī)范越來(lái)越靈活,開(kāi)發(fā)者對(duì)繪圖細(xì)節(jié)有了更多的掌控。立即渲染模式確實(shí)容易使用和理解,但是效率太低。因此從OpenGL3.2開(kāi)始,規(guī)范文檔開(kāi)始廢棄立即渲染模式,并鼓勵(lì)開(kāi)發(fā)者在OpenGL的核心模式(Core-profile)下進(jìn)行開(kāi)發(fā),這個(gè)分支的規(guī)范完全移除了舊的特性。
當(dāng)使用OpenGL的核心模式時(shí),OpenGL迫使我們使用現(xiàn)代的函數(shù)。當(dāng)我們?cè)噲D使用一個(gè)已廢棄的函數(shù)時(shí),OpenGL會(huì)拋出一個(gè)錯(cuò)誤并終止繪圖?,F(xiàn)代函數(shù)的優(yōu)勢(shì)是更高的靈活性和效率,然而也更難于學(xué)習(xí)。立即渲染模式從OpenGL實(shí)際運(yùn)作中抽象掉了很多細(xì)節(jié),因此它在易于學(xué)習(xí)的同時(shí),也很難讓人去把握OpenGL具體是如何運(yùn)作的?,F(xiàn)代函數(shù)要求使用者真正理解OpenGL和圖形編程,它有一些難度,然而提供了更多的靈活性,更高的效率,更重要的是可以更深入的理解圖形編程。
這也是為什么我們的教程面向OpenGL3.3的核心模式。雖然上手更困難,但這份努力是值得的。
現(xiàn)今,更高版本的OpenGL已經(jīng)發(fā)布(寫(xiě)作時(shí)最新版本為4.5),你可能會(huì)問(wèn):既然OpenGL 4.5 都出來(lái)了,為什么我們還要學(xué)習(xí)OpenGL 3.3?答案很簡(jiǎn)單,所有OpenGL的更高的版本都是在3.3的基礎(chǔ)上,引入了額外的功能,并沒(méi)有改動(dòng)核心架構(gòu)。新版本只是引入了一些更有效率或更有用的方式去完成同樣的功能。因此,所有的概念和技術(shù)在現(xiàn)代OpenGL版本里都保持一致。當(dāng)你的經(jīng)驗(yàn)足夠,你可以輕松使用來(lái)自更高版本OpenGL的新特性。
當(dāng)使用新版本的OpenGL特性時(shí),只有新一代的顯卡能夠支持你的應(yīng)用程序。這也是為什么大多數(shù)開(kāi)發(fā)者基于較低版本的OpenGL編寫(xiě)程序,并只提供選項(xiàng)啟用新版本的特性。在有些教程里你會(huì)看見(jiàn)更現(xiàn)代的特性,它們同樣會(huì)以這種紅色注釋方式標(biāo)明。
OpenGL的一大特性就是對(duì)擴(kuò)展(Extension)的支持,當(dāng)一個(gè)顯卡公司提出一個(gè)新特性或者渲染上的大優(yōu)化,通常會(huì)以擴(kuò)展的方式在驅(qū)動(dòng)中實(shí)現(xiàn)。如果一個(gè)程序在支持這個(gè)擴(kuò)展的顯卡上運(yùn)行,開(kāi)發(fā)者可以使用這個(gè)擴(kuò)展提供的一些更先進(jìn)更有效的圖形功能。通過(guò)這種方式,開(kāi)發(fā)者不必等待一個(gè)新的OpenGL規(guī)范面世,就可以使用這些新的渲染特性了,只需要簡(jiǎn)單地檢查一下顯卡是否支持此擴(kuò)展。通常,當(dāng)一個(gè)擴(kuò)展非常流行或者非常有用的時(shí)候,它將最終成為未來(lái)的OpenGL規(guī)范的一部分。
使用擴(kuò)展的代碼大多看上去如下:
if(GL_ARB_extension_name){ // 使用硬件支持的全新的現(xiàn)代特性}else{ // 不支持此擴(kuò)展: 用舊的方式去做}
使用OpenGL3.3時(shí),我們很少需要使用擴(kuò)展來(lái)完成大多數(shù)功能,當(dāng)需要的時(shí)候,本教程將提供適當(dāng)?shù)闹甘尽?/p>
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ī),就能更容易理解它的大部分特性。
OpenGL庫(kù)是用C語(yǔ)言寫(xiě)的,同時(shí)也支持多種語(yǔ)言的派生,但其內(nèi)核仍是一個(gè)C庫(kù)。由于C的一些語(yǔ)言結(jié)構(gòu)不易被翻譯到其它的高級(jí)語(yǔ)言,因此OpenGL開(kāi)發(fā)的時(shí)候引入了一些抽象層。“對(duì)象(Object)”就是其中一個(gè)。
在OpenGL中一個(gè)對(duì)象是指一些選項(xiàng)的集合,它代表OpenGL狀態(tài)的一個(gè)子集。比如,我們可以用一個(gè)對(duì)象來(lái)代表繪圖窗口的設(shè)置,之后我們就可以設(shè)置它的大小、支持的顏色位數(shù)等等??梢园褜?duì)象看做一個(gè)C風(fēng)格的結(jié)構(gòu)體(Struct):
當(dāng)我們使用一個(gè)對(duì)象時(shí),通??雌饋?lái)像如下一樣(把OpenGL上下文看作一個(gè)大的結(jié)構(gòu)體):
// OpenGL的狀態(tài)struct OpenGL_Context { ... object* object_Window_Target; ... };
// 創(chuàng)建對(duì)象unsigned int objectId = 0;glGenObject(1, &objectId);// 綁定對(duì)象至上下文glBindObject(GL_WINDOW_TARGET, objectId);// 設(shè)置當(dāng)前綁定到 GL_WINDOW_TARGET 的對(duì)象的一些選項(xiàng)glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);// 將上下文對(duì)象設(shè)回默認(rèn)glBindObject(GL_WINDOW_TARGET, 0);
這一小段代碼展現(xiàn)了你以后使用OpenGL時(shí)常見(jiàn)的工作流。我們首先創(chuàng)建一個(gè)對(duì)象,然后用一個(gè)id保存它的引用(實(shí)際數(shù)據(jù)被儲(chǔ)存在后臺(tái))。然后我們將對(duì)象綁定至上下文的目標(biāo)位置(例子中窗口對(duì)象目標(biāo)的位置被定義成GL_WINDOW_TARGET)。接下來(lái)我們?cè)O(shè)置窗口的選項(xiàng)。最后我們將目標(biāo)位置的對(duì)象id設(shè)回0,解綁這個(gè)對(duì)象。設(shè)置的選項(xiàng)將被保存在objectId所引用的對(duì)象中,一旦我們重新綁定這個(gè)對(duì)象到GL_WINDOW_TARGET位置,這些選項(xiàng)就會(huì)重新生效。
目前提供的示例代碼只是OpenGL如何操作的一個(gè)大致描述,通過(guò)閱讀以后的教程你會(huì)遇到很多實(shí)際的例子。
使用對(duì)象的一個(gè)好處是在程序中,我們不止可以定義一個(gè)對(duì)象,并設(shè)置它們的選項(xiàng),每個(gè)對(duì)象都可以是不同的設(shè)置。在我們執(zhí)行一個(gè)使用OpenGL狀態(tài)的操作的時(shí)候,只需要綁定含有需要的設(shè)置的對(duì)象即可。比如說(shuō)我們有一些作為3D模型數(shù)據(jù)(一棟房子或一個(gè)人物)的容器對(duì)象,在我們想繪制其中任何一個(gè)模型的時(shí)候,只需綁定一個(gè)包含對(duì)應(yīng)模型數(shù)據(jù)的對(duì)象就可以了(當(dāng)然,我們需要先創(chuàng)建并設(shè)置對(duì)象的選項(xiàng))。擁有數(shù)個(gè)這樣的對(duì)象允許我們指定多個(gè)模型,在想畫(huà)其中任何一個(gè)的時(shí)候,直接將對(duì)應(yīng)的對(duì)象綁定上去,便不需要再重復(fù)設(shè)置選項(xiàng)了。
你現(xiàn)在已經(jīng)知道一些OpenGL的相關(guān)知識(shí)了,OpenGL規(guī)范和庫(kù),OpenGL幕后大致的運(yùn)作流程,以及OpenGL使用的一些傳統(tǒng)技巧。不要擔(dān)心你還沒(méi)有完全消化它們,后面的教程我們會(huì)仔細(xì)地講解每一個(gè)步驟,你會(huì)通過(guò)足夠的例子來(lái)真正掌握OpenGL。下一篇我們將新建一個(gè)窗口用來(lái)做我們以后的基礎(chǔ)。
熱門(mén)資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開(kāi)發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說(shuō)明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白??靵?lái)試試!
4. Steam值得入手的武俠游戲盤(pán)點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛(ài)恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)畫(huà)軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫(huà)軟件或動(dòng)畫(huà)工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫(huà)的軟件程序。但是,在3D動(dòng)畫(huà)軟件中還包含了其他類(lèi)型的...
7. 3D動(dòng)漫建模全過(guò)程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫(huà)的形式。像往常一樣,我從Sphere創(chuàng)建它...
8. 如何自己開(kāi)發(fā)一款游戲(游戲開(kāi)發(fā)入門(mén)必看:五大獨(dú)立游戲開(kāi)發(fā)技巧)
?游戲開(kāi)發(fā)入門(mén)必看:五大獨(dú)立游戲開(kāi)發(fā)技巧無(wú)論您是剛剛起步開(kāi)發(fā)自己的第一款游戲,還是已經(jīng)制作了幾款游戲,本篇文章中的5大獨(dú)立游戲開(kāi)發(fā)技巧都可以幫助您更好地設(shè)計(jì)下一款游戲。無(wú)論你對(duì)游戲有著什么樣的概念,都
9. 開(kāi)發(fā)三昧游戲叫什么(三昧動(dòng)漫)
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
最新文章
同學(xué)您好!