OpenGL 圖形庫使用(二) —— 渲染模式铺坞、對象、擴(kuò)展和狀態(tài)機(jī)

版本記錄

版本號 時間
V1.0 2017.07.22

前言

OpenGL 圖形庫項目中一直也沒用過洲胖,最近也想學(xué)著使用這個圖形庫济榨,感覺還是很有意思,也就自然想著好好的總結(jié)一下绿映。
1. OpenGL 圖形庫使用(一) —— 概念基礎(chǔ)

深入認(rèn)識OpenGL ES

它是一個API(Application Programming Interface, 應(yīng)用程序編程接口)腿短,包含了一系列可以操作圖形、圖像的函數(shù)绘梦。然而,OpenGL本身并不是一個API赴魁,它僅僅是一個由Khronos組織制定并維護(hù)的規(guī)范(Specification)卸奉。

OpenGL規(guī)范嚴(yán)格規(guī)定了每個函數(shù)該如何執(zhí)行,以及它們的輸出值颖御。至于內(nèi)部具體每個函數(shù)是如何實(shí)現(xiàn)(Implement)的榄棵,將由OpenGL庫的開發(fā)者自行決定凝颇。因為OpenGL規(guī)范并沒有規(guī)定實(shí)現(xiàn)的細(xì)節(jié),具體的OpenGL庫允許使用不同的實(shí)現(xiàn)疹鳄,只要其功能和結(jié)果與規(guī)范相匹配(亦即拧略,作為用戶不會感受到功能上的差異)。實(shí)際的OpenGL庫的開發(fā)者通常是顯卡的生產(chǎn)商瘪弓。你購買的顯卡所支持的OpenGL版本都為這個系列的顯卡專門開發(fā)的垫蛆。當(dāng)你使用Apple系統(tǒng)的時候,OpenGL庫是由Apple自身維護(hù)的腺怯。在Linux下袱饭,有顯卡生產(chǎn)商提供的OpenGL庫,也有一些愛好者改編的版本呛占。這也意味著任何時候OpenGL庫表現(xiàn)的行為與規(guī)范規(guī)定的不一致時虑乖,基本都是庫的開發(fā)者留下的bug

所有版本的OpenGL規(guī)范文檔都被公開的寄存在Khronos那里晾虑。

OpenGL ES 3.0主要新功能有:

  • 渲染管線多重增強(qiáng)疹味,實(shí)現(xiàn)先進(jìn)視覺效果的加速,包括遮擋查詢(Occlusion Query)帜篇、變緩反饋(Transform Feedback)糙捺、實(shí)例渲染(Instanced Rendering)、四個或更多渲染目標(biāo)支持坠狡。
  • 高質(zhì)量ETC2/EAC紋理壓縮格式成為一項標(biāo)準(zhǔn)功能继找,不同平臺上不再需要需要不同的紋理集。
  • 新版GLSL ES 3.0著色語言逃沿,全面支持整數(shù)和32位浮點(diǎn)操作婴渡。
  • 紋理功能大幅增強(qiáng),支持浮點(diǎn)紋理凯亮、3D紋理边臼、深度紋理、頂點(diǎn)紋理假消、NPOT紋理柠并、R/RG單雙通道紋理、不可變紋理富拗、2D陣列紋理臼予、無二次冪限制紋理、陰影對比啃沪、調(diào)配(swizzle)粘拾、LOD與mip level clamps、無縫立方體貼圖创千、采樣對象缰雇、紋理MSAA抗鋸齒渲染器入偷。
  • 一系列廣泛的精確尺寸紋理和渲染緩沖格式,便攜移動應(yīng)用更簡單械哟。

在ios上疏之,可以支持openGL ES 3.0的最低環(huán)境是iphone5s ios 7.0


核心模式與立即渲染模式

下面我們就看一下渲染模式。

早期的OpenGL使用立即渲染模式(Immediate mode暇咆,也就是固定渲染管線)锋爪,這個模式下繪制圖形很方便。OpenGL的大多數(shù)功能都被庫隱藏起來糯崎,開發(fā)者很少能控制OpenGL如何進(jìn)行計算的自由几缭。而開發(fā)者迫切希望能有更多的靈活性。隨著時間推移沃呢,規(guī)范越來越靈活年栓,開發(fā)者對繪圖細(xì)節(jié)有了更多的掌控。立即渲染模式確實(shí)容易使用和理解薄霜,但是效率太低某抓。因此從OpenGL3.2開始,規(guī)范文檔開始廢棄立即渲染模式惰瓜,并鼓勵開發(fā)者在OpenGL的核心模式(Core-profile)下進(jìn)行開發(fā)否副,這個分支的規(guī)范完全移除了舊的特性。

當(dāng)使用OpenGL的核心模式時崎坊,OpenGL迫使我們使用現(xiàn)代的函數(shù)备禀。當(dāng)我們試圖使用一個已廢棄的函數(shù)時,OpenGL會拋出一個錯誤并終止繪圖∧巫幔現(xiàn)代函數(shù)的優(yōu)勢是更高的靈活性和效率曲尸,然而也更難于學(xué)習(xí)。立即渲染模式從OpenGL實(shí)際運(yùn)作中抽象掉了很多細(xì)節(jié)男翰,因此它在易于學(xué)習(xí)的同時另患,也很難讓人去把握OpenGL具體是如何運(yùn)作的。現(xiàn)代函數(shù)要求使用者真正理解OpenGL和圖形編程蛾绎,它有一些難度昆箕,然而提供了更多的靈活性,更高的效率租冠,更重要的是可以更深入的理解圖形編程鹏倘。

當(dāng)使用新版本的OpenGL特性時,只有新一代的顯卡能夠支持你的應(yīng)用程序顽爹。這也是為什么大多數(shù)開發(fā)者基于較低版本的OpenGL編寫程序纤泵,并只提供選項啟用新版本的特性。


擴(kuò)展

OpenGL的一大特性就是對擴(kuò)展(Extension)的支持话原,當(dāng)一個顯卡公司提出一個新特性或者渲染上的大優(yōu)化夕吻,通常會以擴(kuò)展的方式在驅(qū)動中實(shí)現(xiàn)。如果一個程序在支持這個擴(kuò)展的顯卡上運(yùn)行繁仁,開發(fā)者可以使用這個擴(kuò)展提供的一些更先進(jìn)更有效的圖形功能涉馅。通過這種方式,開發(fā)者不必等待一個新的OpenGL規(guī)范面世黄虱,就可以使用這些新的渲染特性了稚矿,只需要簡單地檢查一下顯卡是否支持此擴(kuò)展。通常捻浦,當(dāng)一個擴(kuò)展非常流行或者非常有用的時候晤揣,它將最終成為未來的OpenGL規(guī)范的一部分。

使用擴(kuò)展的代碼大多看上去如下:

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


狀態(tài)機(jī)

OpenGL自身是一個巨大的狀態(tài)機(jī)(State Machine):一系列的變量描述OpenGL此刻應(yīng)當(dāng)如何運(yùn)行朱灿。OpenGL的狀態(tài)通常被稱為OpenGL上下文(Context)昧识。我們通常使用如下途徑去更改OpenGL狀態(tài):設(shè)置選項,操作緩沖盗扒。最后跪楞,我們使用當(dāng)前OpenGL上下文來渲染。

假設(shè)當(dāng)我們想告訴OpenGL去畫線段而不是三角形的時候侣灶,我們通過改變一些上下文變量來改變OpenGL狀態(tài)甸祭,從而告訴OpenGL如何去繪圖。一旦我們改變了OpenGL的狀態(tài)為繪制線段褥影,下一個繪制命令就會畫出線段而不是三角形池户。

當(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í)行一些操作栅贴。只要你記住OpenGL本質(zhì)上是個大狀態(tài)機(jī)斟湃,就能更容易理解它的大部分特性。


對象

OpenGL庫是用C語言寫的檐薯,同時也支持多種語言的派生凝赛,但其內(nèi)核仍是一個C庫。由于C的一些語言結(jié)構(gòu)不易被翻譯到其它的高級語言坛缕,因此OpenGL開發(fā)的時候引入了一些抽象層墓猎。“對象(Object)”就是其中一個。

在OpenGL中一個對象是指一些選項的集合,它代表OpenGL狀態(tài)的一個子集藤肢。比如归形,我們可以用一個對象來代表繪圖窗口的設(shè)置,之后我們就可以設(shè)置它的大小左胞、支持的顏色位數(shù)等等寇仓。可以把對象看做一個C風(fēng)格的結(jié)構(gòu)體(Struct)烤宙。

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

當(dāng)我們使用一個對象時遍烦,通常看起來像如下一樣(把OpenGL上下文看作一個大的結(jié)構(gòu)體)躺枕。

// OpenGL的狀態(tài)
struct OpenGL_Context {
    ...
    object* object_Window_Target;
    ...     
};

// 創(chuàng)建對象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 綁定對象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 設(shè)置當(dāng)前綁定到 GL_WINDOW_TARGET 的對象的一些選項
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);

這一小段代碼展現(xiàn)了你以后使用OpenGL時常見的工作流服猪。我們首先創(chuàng)建一個對象,然后用一個id保存它的引用(實(shí)際數(shù)據(jù)被儲存在后臺)拐云。然后我們將對象綁定至上下文的目標(biāo)位置(例子中窗口對象目標(biāo)的位置被定義成GL_WINDOW_TARGET)罢猪。接下來我們設(shè)置窗口的選項。最后我們將目標(biāo)位置的對象id設(shè)回0叉瘩,解綁這個對象膳帕。設(shè)置的選項將被保存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置房揭,這些選項就會重新生效备闲。

使用對象的一個好處是在程序中,我們不止可以定義一個對象捅暴,并設(shè)置它們的選項恬砂,每個對象都可以是不同的設(shè)置。在我們執(zhí)行一個使用OpenGL狀態(tài)的操作的時候蓬痒,只需要綁定含有需要的設(shè)置的對象即可泻骤。

參考資源

1. LearnOpenGL
2. opengl.org:OpenGL官方網(wǎng)站。
3. OpenGL registry:包含OpenGL各版本的規(guī)范和擴(kuò)展梧奢。

后記

未完狱掂,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亲轨,隨后出現(xiàn)的幾起案子趋惨,更是在濱河造成了極大的恐慌,老刑警劉巖惦蚊,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器虾,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹦锋,警方通過查閱死者的電腦和手機(jī)兆沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莉掂,“玉大人葛圃,你說我怎么就攤上這事。” “怎么了库正?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵曲楚,是天一觀的道長。 經(jīng)常有香客問我褥符,道長洞渤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任属瓣,我火速辦了婚禮,結(jié)果婚禮上讯柔,老公的妹妹穿的比我還像新娘抡蛙。我一直安慰自己,他們只是感情好魂迄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布粗截。 她就那樣靜靜地躺著,像睡著了一般捣炬。 火紅的嫁衣襯著肌膚如雪熊昌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天湿酸,我揣著相機(jī)與錄音婿屹,去河邊找鬼。 笑死推溃,一個胖子當(dāng)著我的面吹牛昂利,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铁坎,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蜂奸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硬萍?” 一聲冷哼從身側(cè)響起扩所,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朴乖,沒想到半個月后祖屏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寒砖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年赐劣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩都。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魁兼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咐汞,我是刑警寧澤盖呼,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站化撕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏植阴。R本人自食惡果不足惜蟹瘾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憾朴。 院中可真熱鬧众雷,春花似錦砾省、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至声登,卻和暖如春翻诉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捌刮。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工碰煌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绅作。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓芦圾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俄认。 傳聞我的和親對象是個殘疾皇子个少,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容