OpenGL / OpenGL ES 專業(yè)名詞解析

一限煞、簡(jiǎn)介

(1)OpenGL

  • OpenGL(英語(yǔ):Open Graphics Library抹恳,譯名:開放圖形庫(kù)或者開放式圖形庫(kù))是用于渲染2D、3D矢量圖形的跨語(yǔ)言署驻、跨平臺(tái)的應(yīng)用程序編程接口(API)奋献。這個(gè)接口由近350個(gè)不同的函數(shù)調(diào)用組成,用來從簡(jiǎn)單的圖形比特繪制復(fù)雜的三維景象旺上。而另一種程序接口系統(tǒng)是僅用于Microsoft Windows上的Direct3D瓶蚂。OpenGL常用于CAD、虛擬現(xiàn)實(shí)宣吱、科學(xué)可視化程序和電子游戲開發(fā)窃这。

Direct 3D是基于微軟的通用對(duì)象模式COM(Common Object Mode)的3D圖形API。它是微軟公司DirectX SDK集成開發(fā)包中的重要部分征候,適合多媒體杭攻、娛樂、即時(shí)3D動(dòng)畫等廣泛和實(shí)用的3D圖形計(jì)算疤坝。
DirectX 是由很多API組成的兆解,DirectX并不不是?一個(gè)單純的圖形API. 最重要的是DirectX 是屬于Windows上?個(gè)多媒體處理API。并不?持Windows以外的平臺(tái),所以不是跨平臺(tái)框架跑揉。 按照性質(zhì)分類锅睛,可以分為四大部分,顯示部分、聲音部分现拒、輸入部分和?絡(luò)部分往枣。

(2)OpenGL ES

  • OpenGL ES(OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對(duì)手機(jī)枝嘶、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)周崭。2014年到2018年.蘋果完成了系統(tǒng)內(nèi)部從OpenGL ES過度到Metal。直到WWDC 2018扛点,Apple 宣布 iOS 12 將棄用 OpenGL / CL哥遮。

在 WWDC 2014 上,Apple為游戲開發(fā)者推出了新的平臺(tái)技術(shù) Metal陵究,該技術(shù)能夠?yàn)?3D 圖像提高 10 倍的渲染性能眠饮,并支持大家熟悉的游戲引擎及公司。
Metal 是一種低層次的渲染應(yīng)用程序編程接口铜邮,提供了軟件所需的最低層仪召,保證軟件可以運(yùn)行在不同的圖形芯片上。Metal 提升了 A7 與 A8 處理器效能松蒜,讓其性能完全發(fā)揮扔茅。

二、OpenGL / OpenGL ES 用來做什么秸苗?

  • OpenGL常用于CAD召娜、虛擬現(xiàn)實(shí)、科學(xué)可視化程序和電子游戲開發(fā)惊楼。簡(jiǎn)單來說就是實(shí)現(xiàn)圖形的底層渲染玖瘸。
    比如在游戲開發(fā)中,對(duì)于游戲場(chǎng)景/游戲人物的渲染;
    比如在音視頻開發(fā)中,對(duì)于視頻解碼后的數(shù)據(jù)渲染檀咙;
    比如在地圖引擎,對(duì)于地圖上的數(shù)據(jù)渲染雅倒;
    比如在動(dòng)畫中,實(shí)現(xiàn)動(dòng)畫的繪制;
    比如在視頻處理中,對(duì)于視頻加上濾鏡效果弧可;
    ......

三蔑匣、專業(yè)名詞解析

初學(xué)OpenGL,初學(xué)者常會(huì)對(duì)各類專業(yè)名詞感到疑惑侣诺,不能清晰理解其意義殖演,下面就來講講這寫專業(yè)名詞,如有錯(cuò)誤或者補(bǔ)充的年鸳,歡迎在下面留言趴久。

(1)OpenGL上下文(context)

  • 在應(yīng)用程序調(diào)用任何OpenGL的指令之前,需要安排首先創(chuàng)建一個(gè)OpenGL的上下文搔确。這個(gè)上下文是一個(gè)非常龐大的狀態(tài)機(jī)彼棍,保存了OpenGL中的各種狀態(tài)灭忠,這也是OpenGL指令執(zhí)行的基礎(chǔ)
  • OpenGL的函數(shù)不管在哪個(gè)語(yǔ)言中,都是類似C語(yǔ)言一樣的面相過程的函數(shù)座硕,本質(zhì)上都是對(duì)OpenGL上下文這個(gè)龐大的狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行操作弛作,當(dāng)然你的首先把這個(gè)對(duì)象設(shè)置為當(dāng)前對(duì)象。因此华匾,通過對(duì)OpenGL指令的封裝映琳,是可以將OpenGL的相關(guān)調(diào)用封裝稱謂一個(gè)面向?qū)ο蟮膱D形API
  • 由于OpenGL上下文是一個(gè)巨大的狀態(tài)機(jī)、切換上下文往往會(huì)產(chǎn)生較大的開銷蜘拉,但是不同的繪制模塊萨西,可能需要使用完全獨(dú)立的狀態(tài)管理。因此旭旭,可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文谎脯,在不同線程中使用不同的上下文,上下文之間共享紋理持寄、緩沖區(qū)等資源源梭。這樣的方案會(huì)比仿佛切換上下文,或者大量修改渲染狀態(tài)稍味,更加合理高效的废麻。

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

  • 狀態(tài)機(jī)是理論上的一種機(jī)器,換而言之仲闽,狀態(tài)機(jī)描述了一個(gè)對(duì)象在其生命周期內(nèi)所經(jīng)歷的各種狀態(tài)脑溢,狀態(tài)間的轉(zhuǎn)變,發(fā)生轉(zhuǎn)變的動(dòng)因赖欣,條件及轉(zhuǎn)變中所執(zhí)行的活動(dòng)⊙槊恚或者說顶吮,狀態(tài)機(jī)是一種行為,說明對(duì)象在其生命周期中相應(yīng)時(shí)間鎖經(jīng)歷的狀態(tài)序列以及對(duì)那些狀態(tài)時(shí)間的相應(yīng)粪薛。因此具有以下特點(diǎn):
    1. 有記憶功能悴了,能記住其當(dāng)前的狀態(tài)
    2. 可以接收輸入,根據(jù)輸入的內(nèi)容和自己的原先狀態(tài)违寿,修改自己當(dāng)前狀態(tài)湃交,并且可以有對(duì)應(yīng)輸出
    3. 當(dāng)進(jìn)入特殊狀態(tài)的時(shí)候,變不再接受輸入藤巢,停止工作搞莺;

(3)渲染(Rendering)

  • 將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像到屏幕上的過程叫做渲染。

(4)頂點(diǎn)

  • 頂點(diǎn)指的是我們?cè)诶L制?個(gè)圖形時(shí)掂咒,它的頂點(diǎn)位置數(shù)據(jù)才沧。?這個(gè)數(shù)據(jù)可以直接存儲(chǔ)在數(shù)組中或者將其緩存到GPU內(nèi)存中迈喉。

(5)頂點(diǎn)數(shù)組(VertexArray)和頂點(diǎn)緩沖區(qū)(VertexBuffer)

  • OpenGL的圖像都是由圖元組成。在OpenGLES中温圆,有3種類型的圖元:點(diǎn)挨摸、線、三角形岁歉。通常得运,我們?cè)谡{(diào)用繪制?法的時(shí)候,有兩種方法:一種是锅移,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù)澈圈,也就是說這部分?jǐn)?shù)據(jù)之前是存儲(chǔ)在內(nèi)存當(dāng)中的,被稱為頂點(diǎn)數(shù)組帆啃。另一種則是性能更加?效的瞬女,做法是,提前分配一塊顯存努潘,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng)中诽偷。這部分的顯存,就被稱為頂點(diǎn)緩沖區(qū)疯坤。

(6)管線

  • 在OpenGL下渲染圖形报慕,就會(huì)有經(jīng)歷一個(gè)一個(gè)節(jié)點(diǎn)。而這樣的操作可以理解為管線压怠。大家可以想象成流水線眠冈。每個(gè)任務(wù)類似流水線般執(zhí)行。任務(wù)之間有先后順序菌瘫。管線是一個(gè)抽象的概念蜗顽,之所以稱之為管線是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是按照 一個(gè)固定的順序來的,?且嚴(yán)格按照這個(gè)順序雨让。就像水從一根管?子的一端流到另一端雇盖,這個(gè)順序是不能打破的。

(7)固定管線/存儲(chǔ)著色器

  • 固定管線:在早期的OpenGL版本栖忠,它封裝了很多種著色器程序塊內(nèi)置的一段包含了光照崔挖,坐標(biāo)變換,裁剪等諸多功能的固定shader程序來完成庵寞,來幫助開發(fā)者完成圖形的渲染狸相,而開發(fā)這只需要傳入相應(yīng)的參數(shù),就能快速完成圖形的渲染捐川。類似于iOS開發(fā)會(huì)封裝很多API脓鹃,而我們只需要調(diào)用,就可以實(shí)現(xiàn)功能属拾,不需要關(guān)注底層實(shí)現(xiàn)原理将谊。
  • 可編程管線:由于OpenGL的使用場(chǎng)景非常豐富冷溶,固定管線或存儲(chǔ)著色器無(wú)法完成每一個(gè)業(yè)務(wù),這時(shí)尊浓,將相關(guān)部分開放成可編程逞频,則稱之為可編程管線。

(8)著色器程序Shader

  • 將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€栋齿。因此苗胀,在OpenGL實(shí)際調(diào)用繪制函數(shù)之前,還需要指定一個(gè)由shader編譯成的著色器程序瓦堵。常見的著色器主要有頂點(diǎn)著色器基协,片元著色器(片段著色器/像素著色器),幾何著色器菇用,細(xì)分著色器澜驮。在OpenGL3.0中,依然只支持頂點(diǎn)著色器和片段著色器這兩個(gè)最基礎(chǔ)的著色器惋鸥。
  • OpenGL在處理shader時(shí)杂穷,和其它編譯器一樣,通過編譯卦绣,鏈接等步驟耐量,生成了著色器程序,著色器程序同時(shí)包含了頂點(diǎn)著色器和片段著色器的運(yùn)算邏輯滤港。
    在OpenGL進(jìn)行繪制的時(shí)候廊蜒,首先由頂點(diǎn)著色器對(duì)傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算。再通過圖元裝配溅漾,將頂點(diǎn)轉(zhuǎn)換為圖元山叮。然后進(jìn)行光柵化,將圖元這種矢量圖形樟凄,轉(zhuǎn)換為柵格化數(shù)據(jù)聘芜。最后將柵格化數(shù)據(jù)傳入片段著色器中進(jìn)行運(yùn)算。片段著色器會(huì)對(duì)柵格化數(shù)據(jù)中而每一個(gè)像素進(jìn)行運(yùn)算缝龄,并決定像素的顏色。


    1.1OpenGL繪制過程.png

(9)頂點(diǎn)著色器VertexShader

  • 一般用來處理圖形每個(gè)頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影)挂谍;
  • 頂點(diǎn)著色器是OpenGL中用于計(jì)算頂點(diǎn)屬性的程序叔壤。頂點(diǎn)著色器是逐頂點(diǎn)運(yùn)算的程序,也就是說每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)行一次頂點(diǎn)著色器口叙,當(dāng)然這是并行的炼绘,并且頂點(diǎn)著色器運(yùn)算過程中無(wú)法訪問其他頂點(diǎn)的數(shù)據(jù);
  • 一般來說妄田,典型的需要計(jì)算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)變換俺亮、逐頂點(diǎn)光照運(yùn)算等驮捍。頂點(diǎn)坐標(biāo)由吱自身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)系的運(yùn)算,就是在這里發(fā)生的脚曾。

(10)片元著色器FragmentShader

  • 一般用來處理圖形中每個(gè)像素點(diǎn)顏色計(jì)算和填充东且;
  • 片段著色器是OpenGL中用于計(jì)算片段(像素)顏色的程序。片段著色器是逐像素運(yùn)算的程序本讥,也就是說珊泳,每個(gè)像素都會(huì)執(zhí)行一次片段著色器,當(dāng)然也是并行的拷沸。

(11)GLSL(OpenGL Shading Language)

  • 是用來OpenGL中著色編程的語(yǔ)言色查,也即開發(fā)人員寫的短小的自定義程序,他們是圖形卡的GPU上執(zhí)行的撞芍,代替了固定的渲染管線的一部分秧了,是渲染管線中的不同層次具有可編程行。比如:視圖轉(zhuǎn)換序无、投影轉(zhuǎn)換等验毡。GLSL的著色器代碼分成2個(gè)部分:VertexShader(頂點(diǎn)著色器)和Fragment(片元著色器)。

(12)光柵化Rasterization

  • 是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程愉镰,具有將圖轉(zhuǎn)化為一個(gè)個(gè)柵格化組成的圖像的作用米罚,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的一像素。
  • 光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程丈探。片元中每一個(gè)元素對(duì)應(yīng)于幀緩沖區(qū)中的一個(gè)像素录择。
  • 光柵化其實(shí)是一種將幾何圖元變?yōu)槎S圖像的過程。第一個(gè)碗降,決定哪些地方要被填充隘竭; 第二個(gè),決定每個(gè)像素點(diǎn)的顏色值和深度值讼渊。
  • 把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對(duì)應(yīng)位置的像素及用于填充像素的顏色动看,這個(gè)過程稱為光柵化,這是一個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過程爪幻。

(13)紋理

  • 紋理可以理解為圖片菱皆。大家再渲染圖形時(shí)需要在其編碼填充圖片,為了使得場(chǎng)景更加逼真挨稿,而這里使用的圖片仇轻,就是常說的紋理。但是在OpenGL奶甘,我們更加習(xí)慣叫紋理篷店,而不是圖片。

(14)混合(Blending)

  • 在測(cè)試階段之后臭家,如果像素依然沒有被剔除疲陕,那么像素的顏色將會(huì)和幀緩沖區(qū)中的顏色附著上的顏色進(jìn)行混合方淤,混合的算法可以通過OpenGL的函數(shù)進(jìn)行指定。但是蹄殃,OpenGL提供的混合算法是優(yōu)先的携茂,如果需要更加復(fù)雜的混合算法,一般可以通過像素著色器進(jìn)行實(shí)現(xiàn)窃爷,當(dāng)然性能會(huì)比原生的混合算法差些邑蒋。

(15)變換矩陣(Transfrormation)

  • 圖形想發(fā)生平移,縮放按厘,旋轉(zhuǎn)變換医吊,就需要使用變換矩陣。

(16)投影矩陣(Projection)

  • 用于將3D坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo)逮京,實(shí)際線條也將在二維坐標(biāo)系啊進(jìn)行繪制卿堂。

(17)渲染

  • 渲染緩沖區(qū)?般映射的是系統(tǒng)的資源,?如窗口懒棉。如果將圖像直接渲染到窗口對(duì)應(yīng)的渲染緩沖區(qū)草描,則可以將圖像顯示到屏幕上。
  • 但是策严,值得注意的是穗慕,如果每個(gè)窗口只有一個(gè)緩沖區(qū),那么在繪制過程中屏幕進(jìn)行了刷新妻导,窗口可能顯示出不完整的圖像
  • 為了解決這個(gè)問題逛绵,常規(guī)的OpenGL程序至少都會(huì)有兩個(gè)緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū)倔韭,沒有顯示的稱為離屏緩沖區(qū)术浪。在一個(gè)緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換寿酌,實(shí)現(xiàn)圖像在屏幕上的顯示胰苏。


    1.2屏幕緩沖區(qū)和離屏緩沖區(qū)交換.png
  • 由于顯示器的刷新一般是逐行進(jìn)行的,因此為了防?交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè)不同的幀醇疼,因此交換一般會(huì)等待顯示器刷新完成的信號(hào)硕并,在顯示器兩次刷新的間隔中進(jìn)行交換,這個(gè)信號(hào)就被稱為垂直同步信號(hào)秧荆,這個(gè)技術(shù)被稱為垂直同步鲤孵。
  • 使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進(jìn)行下一幀的渲染辰如,使得幀率無(wú)法完全達(dá)到硬件允許的最高水平。為了解決這個(gè)問題贵试,引?了三緩沖區(qū)技術(shù)琉兜,在等待垂直同步時(shí)凯正,來 回交替渲染兩個(gè)離屏的緩沖區(qū),而垂直同步發(fā)?時(shí)豌蟋,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換廊散,實(shí)現(xiàn)充分利用硬件性能的目的。

四梧疲、結(jié)尾

  • 以上是OpenGL初學(xué)者常遇到的專業(yè)名詞解釋允睹,希望能幫助到大家!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幌氮,一起剝皮案震驚了整個(gè)濱河市缭受,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌该互,老刑警劉巖米者,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宇智,居然都是意外死亡蔓搞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門随橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喂分,“玉大人,你說我怎么就攤上這事机蔗∑哑恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蜒车,是天一觀的道長(zhǎng)讳嘱。 經(jīng)常有香客問我,道長(zhǎng)酿愧,這世上最難降的妖魔是什么沥潭? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮嬉挡,結(jié)果婚禮上钝鸽,老公的妹妹穿的比我還像新娘。我一直安慰自己庞钢,他們只是感情好拔恰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著基括,像睡著了一般颜懊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天河爹,我揣著相機(jī)與錄音匠璧,去河邊找鬼。 笑死咸这,一個(gè)胖子當(dāng)著我的面吹牛夷恍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播媳维,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼酿雪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了侄刽?” 一聲冷哼從身側(cè)響起指黎,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唠梨,沒想到半個(gè)月后袋励,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡当叭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年茬故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚁鳖。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磺芭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醉箕,到底是詐尸還是另有隱情钾腺,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布讥裤,位于F島的核電站放棒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏己英。R本人自食惡果不足惜间螟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望损肛。 院中可真熱鬧厢破,春花似錦、人聲如沸治拿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)劫谅。三九已至见坑,卻和暖如春嚷掠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳄梅。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工叠国, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戴尸。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冤狡,于是被迫代替她去往敵國(guó)和親孙蒙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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