激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

探索OpenGL的基本認(rèn)識(shí)與學(xué)習(xí) - 火星時(shí)代教育

發(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游戲引擎開(kāi)發(fā)第一章(OpenGL基本認(rèn)識(shí))

早期的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基本認(rèn)識(shí)與學(xué)習(xí)

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ī),就能更容易理解它的大部分特性。

對(duì)象

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)了。

讓我們開(kāi)始吧

你現(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)課程推薦

熱門(mén)資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
確定