一分俯、OpenGL專業(yè)名詞解析

0. 初識圖形API

OpenGL(Open Graphics Library)是?個跨編程語?言、跨平臺的編程圖形程序接?口哆料,它將計算機的資源抽象稱為?個OpenGL的對象缸剪,對這些資源的操作抽象為?個的OpenGL指令。

OpenGL ES (OpenGL for Embedded Systems)是 OpenGL三維圖形 API 的?子集东亦,針對?手機杏节、 PDA和游戲主機等嵌?入式設(shè)備?而設(shè)計,去除了了許多不不必要和性能較低的API接?口讥此。

DirectX 是由很多API組成的拢锹,DirectX并不不是?個單純的圖形API. 最重要的是DirectX是屬于 Windows上?個多媒體處理理API。并不支持Windows以外的平臺萄喳,所以不是跨平臺框架卒稳, 按照性 質(zhì)分類,可以分為四?大部分他巨,顯示部分充坑、聲?音部分、輸?入部分和?網(wǎng)絡(luò)部分染突。

Metal : Apple為游戲開發(fā)者推出了了新的平臺技術(shù)Metal捻爷,該技術(shù)能夠為 3D 圖像提?高 10 倍的渲染性能。Metal是Apple為了了解決3D渲染?而推出的框架份企。

1. OpenGL狀態(tài)機

狀態(tài)機可以理解為一臺可以保存狀態(tài)也榄,并根據(jù)當前狀態(tài)進行相應輸出的機器。

核心要點:

  • 記憶功能司志,保存當前狀態(tài)
  • 接收輸入甜紫,修改當前狀態(tài),或根據(jù)當前狀態(tài)進行輸出
  • 當進?特殊狀態(tài)(停機狀態(tài))時骂远,不再接收輸?囚霸,停?工作

2. OpenGL上下文(context)

在應?程序調(diào)?任何OpenGL的指令之前,首先需要創(chuàng)建?個OpenGL的上下?文激才。這個上下?是?個?常龐?的狀態(tài)機拓型,保存了了OpenGL中的各種狀態(tài),這也是OpenGL指令執(zhí)?的基礎(chǔ)瘸恼。

OpenGL的函數(shù)不管在哪個語?中劣挫,都是類似C語?一樣的面向過程的函數(shù)。本質(zhì)上都是對OpenGL上下?這個龐?的狀態(tài)機中的某個狀態(tài)或者對象進行操作东帅。通過對 OpenGL指令的封裝揣云,可以將OpenGL的相關(guān)調(diào)?封裝成為?個?向?qū)ο蟮膱D形API。

由于OpenGL上下?是?個巨?大的狀態(tài)機冰啃,切換上下文往往會產(chǎn)生較?的開銷邓夕,但是不同的繪制模塊刘莹,可能需要使?完全獨立的狀態(tài)管理。因此焚刚,可以在應?程序中分別創(chuàng)建多個不同的上下文点弯,在不同線程中使?不同的上下文,上下?之間共享紋理矿咕、緩沖區(qū)等資源抢肛。這樣的?方案,會?比反復切換上下?碳柱,或者?量修改渲染狀態(tài)捡絮,更加合理高效。

核心要點:

  • OpenGL指令執(zhí)?的基礎(chǔ)莲镣,是?個?常龐?的狀態(tài)機福稳。
  • OpenGL上下文切換開銷大。雖然可能使用多個上下文瑞侮,但上下文之間會共享紋理的圆、緩沖區(qū)等資源
  • OpenGL的函數(shù)雖然是面向過程的半火,但可以把相關(guān)的調(diào)用封裝為面向過程的圖形API越妈。

3. 渲染

將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像操作叫做渲染(Rendering)。

4. 頂點數(shù)組和頂點緩沖區(qū)

頂點數(shù)據(jù)就是圖像的輪廓钮糖。OpenGL中的圖像都是由圖元組成梅掠。在OpenGL ES中,有3種類型的圖元:點店归、線瓤檐、三?形。

在調(diào)?繪制?法的時候娱节,直接由內(nèi)存?zhèn)魅腠旤c數(shù)據(jù),也就是說這部分數(shù)據(jù)之前是存儲在內(nèi)存當中的祭示,被稱為頂點數(shù)組(VertexArray)肄满。

?性能更高的做法是,提前分配?塊顯存质涛,將頂點數(shù)據(jù)預先傳?到顯存當中稠歉。這部分的顯存,就被稱為頂點緩沖區(qū)(VertexBuffer)汇陆。

核心要點:

  • 3種類型的圖元:點怒炸、線、三?形毡代。
  • 頂點數(shù)組(VertexArray)在內(nèi)存中阅羹。
  • 頂點緩沖區(qū)(VertexBuffer)在緩存中勺疼。

5. 管線

OpenGL下渲染圖形,就會經(jīng)歷?個?個的節(jié)點捏鱼。而這樣的操作可以理理解管線执庐。就像一個流?線,任務按照先后順序依次執(zhí)行导梆。管線是?個抽象的概念轨淌,之所以稱之為管線是因為顯卡在處理數(shù)據(jù)的時候是按照一個固定的順序來的,而且嚴格按照這個順序看尼。

核心要點:

  • 任務嚴格按順序依次執(zhí)行递鹉。

6. 固定管線/存儲著色器

在早期的OpenGL版本,封裝了多種著色器程序塊藏斩,內(nèi)置了一段包含了光照躏结、坐標變換、裁剪等諸多功能的固定shader程序來完成灾茁。來幫助開發(fā)者來完成圖形的渲染窜觉。開發(fā)者只需要傳入相應的參數(shù),就能快速完成圖形的渲染北专。類似于iOS開發(fā)會封裝很多API禀挫,而我們只需要調(diào)?,就可以實現(xiàn)功能拓颓,不需要關(guān)注底層實現(xiàn)原理语婴。
但是由于OpenGL的使?場景?常豐富,固定管線或存儲著?器?法完成每一 個業(yè)務驶睦,這時將相關(guān)部分開放成可編程砰左。

核心要點:

  • 早期的OpenGL版本封裝的輔助快速開發(fā)的著色器程序塊。
  • 由于提供的功能有限场航,后期變成了可編程的形式缠导。

7. 著?器程序(Shader)

將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€。

OpenGL在實際調(diào)?繪制函數(shù)之前溉痢,還需要指定?個由shader編譯成的著色器程序僻造。常見的著?器主要有頂點著?器(VertexShader),?段著?器(FragmentShader)/像素著?器(PixelShader)孩饼,幾何著?(GeometryShader)髓削,曲?細分著?器(TessellationShader)。片段著?器和像素著?器只是在OpenGLDX中的不同叫法而已镀娶×⑻牛可惜的是,直到OpenGL ES 3.0梯码,OpenGL ES依然只?持頂點著?器和片段著?器這兩個最基礎(chǔ)的著?器宝泵。

OpenGL在處理理shader時好啰,和其他編譯器一樣。通過編譯鲁猩、鏈接等步驟坎怪,?成了著?器程序(glProgram),著?器程序同時包含了頂點著?器和?段著?器的運算邏輯廓握。在OpenGL進行繪制的時候搅窿,?先由頂點著?器對傳?的頂點數(shù)據(jù)進?運算。再通過圖元裝配隙券,將頂點轉(zhuǎn)換為圖元男应。然后進?光柵化,將圖元這種?量圖形娱仔,轉(zhuǎn)換為柵格化數(shù)據(jù)沐飘。最后,將柵格化數(shù)據(jù)傳入?段著?器中進?運算牲迫。?段著?器會對柵格化數(shù)據(jù)中的每一個像素進行運算耐朴,并決定像素的顏?。

核心要點:

  • 將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€盹憎。
  • 常見的著?器主要有頂點著?器筛峭,?段著?器/像素著?器,幾何著?陪每,曲?細分著?器影晓。
  • OpenGL ES只?持頂點著?器和片段著?器。
  • OpenGL通過編譯檩禾、鏈接等步驟挂签,將?成著?器程序。
  • OpenGL進行繪制的時候盼产,由頂點著?器對傳?的頂點數(shù)據(jù)進?運算饵婆。再通過圖元裝配,將頂點轉(zhuǎn)換為圖元戏售。之后進?光柵化侨核,將圖元這種?量圖形,轉(zhuǎn)換為柵格化數(shù)據(jù)蜈项。最后,將柵格化數(shù)據(jù)傳入?段著?器中進?運算续挟。?段著?器會對柵格化數(shù)據(jù)中的每一個像素進行運算紧卒,并決定像素的顏?。
7.1 頂點著?器(VertexShader)

頂點著?器是OpenGL中?于計算頂點屬性的程序诗祸。

?般來說典型的需要計算的頂點屬性主要包括頂點坐標變換跑芳、逐頂點光照運算等等轴总。頂點坐標由?身坐標系轉(zhuǎn)換到歸一化坐標系的運算,就是在這里發(fā)?的博个。

頂點著?器是逐頂點運算的程序怀樟,也就是說每個頂點數(shù)據(jù)都會執(zhí)?一次頂點著?器。當然這是并行的盆佣,并且頂點著?器運算過程中?法訪問其他頂點的數(shù)據(jù)往堡。

核心要點:

  • ?般?來處理理圖形每個頂點變換(旋轉(zhuǎn)/平移/投影等)。
  • 并行計算共耍,且運算過程中?法訪問其他頂點的數(shù)據(jù)虑灰。
7.2 片段著?器(FragmentShader)

?段著?器是OpenGL中?于計算?段(像素)顏?的程序。一般?來處理圖形中每個像素點顏?計算和填充痹兜。

?段著?器是逐像素運算的程序穆咐,也就是說每個像素都會執(zhí)?一次?段著?器,當然也是并?的字旭。

核心要點:

  • 一般?來處理圖形中每個像素點顏?計算和填充对湃。
  • 并行計算,且運算過程中?法訪問其他頂點的數(shù)據(jù)遗淳。

8. GLSL(OpenGL Shading Language)

GLSL著色語?是?來在OpenGL中著?編程的語?拍柒,是在圖形卡的GPU上執(zhí)?的。代替了固定的渲染管線的?部分洲脂,使渲染管線中不同層次具有可編程性斤儿。?如:視圖轉(zhuǎn)換、投影轉(zhuǎn)換等恐锦。GLSL(GL Shading Language)的著?器代碼分成2個部分: Vertex Shader(頂點著?器)和Fragment(?斷著?器)往果。

9. 光柵化(Rasterization)

光柵化就是把頂點數(shù)據(jù)轉(zhuǎn)換為片元的過程。具有將圖轉(zhuǎn)化為?個個柵格組成的圖象 的作?一铅,特點是每個元素對應幀緩沖區(qū)中的?像素陕贮。

光柵化其實是?種將?何圖元變?yōu)槎S圖像的過程。該過程包含了兩部分的?作潘飘。第?部分工作:決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?肮之;第?部分?作:分配一個顏?值和?個深度值到各個區(qū)域。

把物體的數(shù)學描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應位置的像素及?于填充像素的顏?卜录,這個過程稱為光柵化戈擒。這是?個將模擬信號轉(zhuǎn)化為離散信號的過程。

核心要點:

  • 光柵化就是把頂點數(shù)據(jù)轉(zhuǎn)換為片元的過程艰毒。
  • 該過程包含了兩部分的?作:①決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?筐高;②分配一個顏?值和?個深度值到各個區(qū)域。

10. 紋理(Texture)

紋理可以理解為圖?。 在渲染圖形時需要在頂點圍成的區(qū)域中填充圖?柑土,使得場景更加逼真蜀肘。?這?使?的圖?,就是常說的紋理稽屏。只是在OpenGL扮宠,我們更加習慣叫紋理,?不是圖?狐榔。

11. 混合(Blending)

在測試階段之后坛增,如果像素依然沒有被剔除,那么像素的顏?將會和幀緩沖區(qū)中顏?附著上的顏色進?混合荒叼,混合的算法可以通過OpenGL的函數(shù)進行指定轿偎。但是OpenGL提供的混合算法有限。如果需要更加復雜的混合算法被廓,一般可以通過片段著?器進?實現(xiàn)坏晦,當然性能會?原?的混合算法差?些。

12. 矩陣

12.1 變換矩陣(Transformation)

例如圖形想發(fā)?平移嫁乘、縮放昆婿、旋轉(zhuǎn)等變換,就需要使用變換矩陣蜓斧。

12.1 投影矩陣(Projection)

?于將3D坐標轉(zhuǎn)換為?維屏幕坐標仓蛆,實際線條也將在二維坐標下進行繪制。

13. 渲染上屏/交換緩沖區(qū)(SwapBuffer)

渲染緩沖區(qū)?般映射的是系統(tǒng)的資源?如窗?挎春。如果將圖像直接渲染到窗口對應的渲染緩沖區(qū)看疙,則可以將圖像顯示到屏幕上。

值得注意的是直奋,如果每個窗?只有?個緩沖區(qū)能庆,那么在繪制過程中屏幕進?了刷新,窗?可能顯示出不完整的圖像脚线。

為了解決這個問題搁胆,常規(guī)的OpenGL程序?少都會有兩個緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū)邮绿,沒有顯示的稱為離屏緩沖區(qū)渠旁。在一個緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換船逮,實現(xiàn)圖像在屏幕上顯示顾腊。

由于顯示器的刷新?般是逐?進?的,為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀挖胃,交換一般會等待顯示器刷新完成的信號杂靶,在顯示器器兩次刷新的間隔中進?交換承耿,這個信號就被稱為垂直同步信號,這個技術(shù)被稱為垂直同步伪煤。

使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染凛辣,使得幀率無法完全達到硬件允許的最??平抱既。為了解決這個問題,引?了三緩沖區(qū)技術(shù)扁誓。在等待垂直同步時防泵,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)?生時蝗敢,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換捷泞,實現(xiàn)充分利利?硬件性能的?的。

核心要點:

  • 如果每個窗?只有?個緩沖區(qū)寿谴,若在繪制過程中屏幕進?了刷新锁右,窗?可能顯示出不完整的圖像。為了解決這個問題讶泰,常規(guī)的OpenGL程序?少都會有兩個緩沖區(qū)咏瑟。
  • 垂直同步:由于顯示器的刷新?般是逐?進?的,為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀痪署,交換一般會等待顯示器刷新完成的信號码泞,在顯示器器兩次刷新的間隔中進?交換,這個信號就被稱為垂直同步信號狼犯,這個技術(shù)被稱為垂直同步余寥。
  • 三緩沖區(qū)技術(shù):使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染悯森,使得幀率無法完全達到硬件允許的最??平宋舷。為了解決這個問題,引?了三緩沖區(qū)技術(shù)呐馆。在等待垂直同步時肥缔,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)?生時汹来,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換续膳,實現(xiàn)充分利利?硬件性能的?的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末收班,一起剝皮案震驚了整個濱河市坟岔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摔桦,老刑警劉巖社付,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件承疲,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸥咖,警方通過查閱死者的電腦和手機燕鸽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啼辣,“玉大人啊研,你說我怎么就攤上這事∨概。” “怎么了党远?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長富弦。 經(jīng)常有香客問我沟娱,道長,這世上最難降的妖魔是什么腕柜? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任济似,我火速辦了婚禮,結(jié)果婚禮上盏缤,老公的妹妹穿的比我還像新娘碱屁。我一直安慰自己,他們只是感情好蛾找,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布娩脾。 她就那樣靜靜地躺著,像睡著了一般打毛。 火紅的嫁衣襯著肌膚如雪柿赊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天幻枉,我揣著相機與錄音碰声,去河邊找鬼。 笑死熬甫,一個胖子當著我的面吹牛胰挑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椿肩,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贡这!你這毒婦竟也來了厂榛?” 一聲冷哼從身側(cè)響起盖矫,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辈双,失蹤者是張志新(化名)和其女友劉穎责掏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湃望,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡喜爷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年檩帐,在試婚紗的時候發(fā)現(xiàn)自己被綠了另萤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片四敞。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡忿危,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缎玫,到底是詐尸還是另有隱情解滓,我是刑警寧澤洼裤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布腮鞍,位于F島的核電站,受9級特大地震影響雷客,放射性物質(zhì)發(fā)生泄漏桥狡。R本人自食惡果不足惜皱卓,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兄朋。 院中可真熱鬧颅和,春花似錦、人聲如沸蹭越。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽强霎。三九已至城舞,卻和暖如春怕膛,著一層夾襖步出監(jiān)牢的瞬間褐捻,已是汗流浹背椅邓。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工合住, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撒璧,地道東北人卿樱。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奕翔。 傳聞我的和親對象是個殘疾皇子妻往,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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