tft每日頭條

 > 遊戲

 > opengl遊戲編程

opengl遊戲編程

遊戲 更新时间:2024-07-24 03:15:22

opengl遊戲編程?在開始這段旅程之前我們先了解一下OpenGL到底是什麼一般它被認為是一個API(Application Programming Interface, 應用程序編程接口),包含了一系列可以操作圖形、圖像的函數然而,OpenGL本身并不是一個API,它僅僅是一個由Khronos組織制定并維護的規範(Specification),今天小編就來聊一聊關于opengl遊戲編程?接下來我們就一起去研究一下吧!

opengl遊戲編程(OpenGL遊戲引擎開發第一章)1

opengl遊戲編程

在開始這段旅程之前我們先了解一下OpenGL到底是什麼。一般它被認為是一個API(Application Programming Interface, 應用程序編程接口),包含了一系列可以操作圖形、圖像的函數。然而,OpenGL本身并不是一個API,它僅僅是一個由Khronos組織制定并維護的規範(Specification)。

OpenGL規範嚴格規定了每個函數該如何執行,以及它們的輸出值。至于内部具體每個函數是如何實現(Implement)的,将由OpenGL庫的開發者自行決定(譯注:這裡開發者是指編寫OpenGL庫的人)。因為OpenGL規範并沒有規定實現的細節,具體的OpenGL庫允許使用不同的實現,隻要其功能和結果與規範相匹配(亦即,作為用戶不會感受到功能上的差異)。

實際的OpenGL庫的開發者通常是顯卡的生産商。你購買的顯卡所支持的OpenGL版本都為這個系列的顯卡專門開發的。當你使用Apple系統的時候,OpenGL庫是由Apple自身維護的。在Linux下,有顯卡生産商提供的OpenGL庫,也有一些愛好者改編的版本。這也意味着任何時候OpenGL庫表現的行為與規範規定的不一緻時,基本都是庫的開發者留下的bug。

由于OpenGL的大多數實現都是由顯卡廠商編寫的,當産生一個bug時通常可以通過升級顯卡驅動來解決。這些驅動會包括你的顯卡能支持的最新版本的OpenGL,這也是為什麼總是建議你偶爾更新一下顯卡驅動。

所有版本的OpenGL規範文檔都被公開的寄存在Khronos那裡。有興趣的讀者可以找到OpenGL3.3(我們将要使用的版本)的規範文檔。如果你想深入到OpenGL的細節(隻關心函數功能的描述而不是函數的實現),這是個很好的選擇。如果你想知道每個函數具體的運作方式,這個規範也是一個很棒的參考。

核心模式與立即渲染模式

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管線),這個模式下繪制圖形很方便。OpenGL的大多數功能都被庫隐藏起來,開發者很少有控制OpenGL如何進行計算的自由。而開發者迫切希望能有更多的靈活性。随着時間推移,規範越來越靈活,開發者對繪圖細節有了更多的掌控。立即渲染模式确實容易使用和理解,但是效率太低。因此從OpenGL3.2開始,規範文檔開始廢棄立即渲染模式,并鼓勵開發者在OpenGL的核心模式(Core-profile)下進行開發,這個分支的規範完全移除了舊的特性。

當使用OpenGL的核心模式時,OpenGL迫使我們使用現代的函數。當我們試圖使用一個已廢棄的函數時,OpenGL會抛出一個錯誤并終止繪圖。現代函數的優勢是更高的靈活性和效率,然而也更難于學習。立即渲染模式從OpenGL實際運作中抽象掉了很多細節,因此它在易于學習的同時,也很難讓人去把握OpenGL具體是如何運作的。現代函數要求使用者真正理解OpenGL和圖形編程,它有一些難度,然而提供了更多的靈活性,更高的效率,更重要的是可以更深入的理解圖形編程。

這也是為什麼我們的教程面向OpenGL3.3的核心模式。雖然上手更困難,但這份努力是值得的。

現今,更高版本的OpenGL已經發布(寫作時最新版本為4.5),你可能會問:既然OpenGL 4.5 都出來了,為什麼我們還要學習OpenGL 3.3?答案很簡單,所有OpenGL的更高的版本都是在3.3的基礎上,引入了額外的功能,并沒有改動核心架構。新版本隻是引入了一些更有效率或更有用的方式去完成同樣的功能。因此,所有的概念和技術在現代OpenGL版本裡都保持一緻。當你的經驗足夠,你可以輕松使用來自更高版本OpenGL的新特性。

當使用新版本的OpenGL特性時,隻有新一代的顯卡能夠支持你的應用程序。這也是為什麼大多數開發者基于較低版本的OpenGL編寫程序,并隻提供選項啟用新版本的特性。

在有些教程裡你會看見更現代的特性,它們同樣會以這種紅色注釋方式标明。

擴展

OpenGL的一大特性就是對擴展(Extension)的支持,當一個顯卡公司提出一個新特性或者渲染上的大優化,通常會以擴展的方式在驅動中實現。如果一個程序在支持這個擴展的顯卡上運行,開發者可以使用這個擴展提供的一些更先進更有效的圖形功能。通過這種方式,開發者不必等待一個新的OpenGL規範面世,就可以使用這些新的渲染特性了,隻需要簡單地檢查一下顯卡是否支持此擴展。通常,當一個擴展非常流行或者非常有用的時候,它将最終成為未來的OpenGL規範的一部分。

使用擴展的代碼大多看上去如下:

if(GL_ARB_extension_name) { // 使用硬件支持的全新的現代特性 } else { // 不支持此擴展: 用舊的方式去做 }

使用OpenGL3.3時,我們很少需要使用擴展來完成大多數功能,當需要的時候,本教程将提供适當的指示。

狀态機

OpenGL自身是一個巨大的狀态機(State Machine):一系列的變量描述OpenGL此刻應當如何運行。OpenGL的狀态通常被稱為OpenGL上下文(Context)。我們通常使用如下途徑去更改OpenGL狀态:設置選項,操作緩沖。最後,我們使用當前OpenGL上下文來渲染。

假設當我們想告訴OpenGL去畫線段而不是三角形的時候,我們通過改變一些上下文變量來改變OpenGL狀态,從而告訴OpenGL如何去繪圖。一旦我們改變了OpenGL的狀态為繪制線段,下一個繪制命令就會畫出線段而不是三角形。

當使用OpenGL的時候,我們會遇到一些狀态設置函數(State-changing Function),這類函數将會改變上下文。以及狀态使用函數(State-using Function),這類函數會根據當前OpenGL的狀态執行一些操作。隻要你記住OpenGL本質上是個大狀态機,就能更容易理解它的大部分特性。

對象

OpenGL庫是用C語言寫的,同時也支持多種語言的派生,但其内核仍是一個C庫。由于C的一些語言結構不易被翻譯到其它的高級語言,因此OpenGL開發的時候引入了一些抽象層。“對象(Object)”就是其中一個。

在OpenGL中一個對象是指一些選項的集合,它代表OpenGL狀态的一個子集。比如,我們可以用一個對象來代表繪圖窗口的設置,之後我們就可以設置它的大小、支持的顔色位數等等。可以把對象看做一個C風格的結構體(Struct):

struct object_name { float option1; int option2; char[] name; };

在更新前的教程中一直使用的都是OpenGL的基本類型,但由于作者覺得在本教程系列中并沒有一個必須使用它們的原因,所有的類型都改為了自帶類型。但是請仍然記住,使用OpenGL的類型的好處是保證了在各平台中每一種類型的大小都是統一的。你也可以使用其它的定寬類型(Fixed-width Type)來實現這一點。

當我們使用一個對象時,通常看起來像如下一樣(把OpenGL上下文看作一個大的結構體):

// OpenGL的狀态 struct OpenGL_Context { ... object* object_Window_Target; ... };

// 創建對象 unsigned int objectId = 0; glGenObject(1, &objectId); // 綁定對象至上下文 glBindObject(GL_WINDOW_TARGET, objectId); // 設置當前綁定到 GL_WINDOW_TARGET 的對象的一些選項 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); // 将上下文對象設回默認 glBindObject(GL_WINDOW_TARGET, 0);

這一小段代碼展現了你以後使用OpenGL時常見的工作流。我們首先創建一個對象,然後用一個id保存它的引用(實際數據被儲存在後台)。然後我們将對象綁定至上下文的目标位置(例子中窗口對象目标的位置被定義成GL_WINDOW_TARGET)。接下來我們設置窗口的選項。最後我們将目标位置的對象id設回0,解綁這個對象。設置的選項将被保存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置,這些選項就會重新生效。

目前提供的示例代碼隻是OpenGL如何操作的一個大緻描述,通過閱讀以後的教程你會遇到很多實際的例子。

使用對象的一個好處是在程序中,我們不止可以定義一個對象,并設置它們的選項,每個對象都可以是不同的設置。在我們執行一個使用OpenGL狀态的操作的時候,隻需要綁定含有需要的設置的對象即可。比如說我們有一些作為3D模型數據(一棟房子或一個人物)的容器對象,在我們想繪制其中任何一個模型的時候,隻需綁定一個包含對應模型數據的對象就可以了(當然,我們需要先創建并設置對象的選項)。擁有數個這樣的對象允許我們指定多個模型,在想畫其中任何一個的時候,直接将對應的對象綁定上去,便不需要再重複設置選項了。

讓我們開始吧

你現在已經知道一些OpenGL的相關知識了,OpenGL規範和庫,OpenGL幕後大緻的運作流程,以及OpenGL使用的一些傳統技巧。不要擔心你還沒有完全消化它們,後面的教程我們會仔細地講解每一個步驟,你會通過足夠的例子來真正掌握OpenGL。下一篇我們将新建一個窗口用來做我們以後的基礎。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关遊戲资讯推荐

热门遊戲资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved