OpenGL学习---1.1 OpenGL基本介绍
前記:非常有樂趣,學(xué)!!!-------------------------------博主:mx
核心模式與立即渲染模式
立即渲染模式(Immediate mode,也就是固定渲染管線):
優(yōu)點(diǎn):這種模式下繪制圖形方便,容易使用和理解
缺點(diǎn):OpenGL的大多數(shù)功能都被庫隱藏起來了,開發(fā)者很少有控制OpenGL如何進(jìn)行計(jì)算的自由,效率低
核心模式(Core-profile mode):
當(dāng)使用OpenGL的核心模式時(shí),OpenGL迫使我們使用現(xiàn)代的函數(shù)。當(dāng)我們試圖使用一個(gè)已廢棄的函數(shù)時(shí),OpenGL會拋出一個(gè)錯(cuò)誤并終止繪圖。現(xiàn)代函數(shù)的優(yōu)勢是更高的靈活性和效率,然而也更難于學(xué)習(xí)。現(xiàn)代函數(shù)要求使用者真正理解OpenGL和圖形編程,它有一些難度,然而提供了更多的靈活性,更高的效率,更重要的是可以更深入的理解圖形編程。
OpenGL3.3核心模式:
LearnOpenGL教程面向OpenGL3.3的核心模式,你可能會問:既然OpenGL 4.5 都出來了,為什么我們還要學(xué)習(xí)OpenGL 3.3?答案很簡單,所有OpenGL的更高的版本都是在3.3的基礎(chǔ)上,引入了額外的功能,并沒有改動核心架構(gòu)。新版本只是引入了一些更有效率或更有用的方式去完成同樣的功能。因此,所有的概念和技術(shù)在現(xiàn)代OpenGL版本里都保持一致。當(dāng)經(jīng)驗(yàn)足夠,可以輕松使用來自更高版本OpenGL的新特性。
支持?jǐn)U展
OpenGL一大特性就算支持?jǐn)U展(Extension),當(dāng)一個(gè)顯卡公司提出一個(gè)新特性或者渲染上的大優(yōu)化,通常會以擴(kuò)展的方式在驅(qū)動中實(shí)現(xiàn)。如果一個(gè)程序在支持這個(gè)擴(kuò)展的顯卡上運(yùn)行,開發(fā)者可以使用這個(gè)擴(kuò)展提供的一些更先進(jìn)更有效的圖形功能。
使用擴(kuò)展的代碼大多看上去如下:
if(GL_ARB_extension_name)
{
// 使用硬件支持的全新的現(xiàn)代特性
}
else
{
// 不支持此擴(kuò)展: 用舊的方式去做
}
---------博主:mx
本質(zhì)是狀態(tài)機(jī)
簡述
OpenGL本身是一個(gè)巨大的狀態(tài)機(jī)(State Machine):一系列變量告訴OpenGL此刻如何運(yùn)行,OpenGL的狀態(tài)通常被稱為OpenGL的上下文。
改變狀態(tài)
通過如下途徑更改OpenGL狀態(tài):設(shè)置選項(xiàng),操作緩沖。最后,我們使用當(dāng)前OpenGL上下文來渲染。
狀態(tài)設(shè)置函數(shù)(State-changing Function):
這類函數(shù)將會改變上下文。
狀態(tài)使用函數(shù)(State-using Function):
這類函數(shù)會根據(jù)當(dāng)前OpenGL的狀態(tài)執(zhí)行一些操作。
抽象層:面向?qū)ο?br /> 對象
當(dāng)我們使用一個(gè)對象時(shí),通常看起來像如下一樣(把OpenGL上下文看作一個(gè)大的結(jié)構(gòu)體):
// OpenGL的狀態(tài)
struct OpenGL_Context
{
…
object* object_Window_Target;
…
};
工作流
我們首先創(chuàng)建一個(gè)對象,然后用一個(gè)id保存它的引用(實(shí)際數(shù)據(jù)被儲存在后臺)。然后我們將對象綁定至上下文的目標(biāo)位置(例子中窗口對象目標(biāo)的位置被定義成GL_WINDOW_TARGET)。接下來我們設(shè)置窗口的選項(xiàng)。最后我們將目標(biāo)位置的對象id設(shè)回0,解綁這個(gè)對象。設(shè)置的選項(xiàng)將被保存在objectId所引用的對象中,一旦我們重新綁定這個(gè)對象到GL_WINDOW_TARGET位置,這些選項(xiàng)就會重新生效。
---------博主:mx
例子:
// 創(chuàng)建對象
unsignedint objectId = 0;
glGenObject(1, &objectId);
// 綁定對象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 設(shè)置當(dāng)前綁定到 GL_WINDOW_TARGET 的對象的一些選項(xiàng) glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); // 將上下文對象設(shè)回默認(rèn)
glBindObject(GL_WINDOW_TARGET, 0);
優(yōu)勢
在程序中,我們不止可以定義一個(gè)對象,并設(shè)置它們的選項(xiàng),每個(gè)對象都可以是不同的設(shè)置。在我們執(zhí)行一個(gè)使用OpenGL狀態(tài)的操作的時(shí)候,只需要綁定含有需要的設(shè)置的對象即可。比如說我們有一些作為3D模型數(shù)據(jù)(一棟房子或一個(gè)人物)的容器對象,在我們想繪制其中任何一個(gè)模型的時(shí)候,只需綁定一個(gè)包含對應(yīng)模型數(shù)據(jù)的對象就可以了(當(dāng)然,我們需要先創(chuàng)建并設(shè)置對象的選項(xiàng))。擁有數(shù)個(gè)這樣的對象允許我們指定多個(gè)模型,在想畫其中任何一個(gè)的時(shí)候,直接將對應(yīng)的對象綁定上去,便不需要再重復(fù)設(shè)置選項(xiàng)了。
---------博主:mx
總結(jié)
以上是生活随笔為你收集整理的OpenGL学习---1.1 OpenGL基本介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4 OpenGL坐标系
- 下一篇: 单片机和PLC有什么区别?