OpenGL 圖形專有名詞與坐標(biāo)解析

一斋扰、圖形API簡介

OpenGL (Open Graphics Library)是?一個跨編程語言、跨平臺的編程圖形程序接?,它將計算機(jī)的資源抽象稱為?一個個OpenGL的對象杂靶,對這些資源的操作抽象為?一個個的OpenGL指令梆惯。

OpenGL ES (OpenGL for Embedded Systems)是OpenGL三維圖形 API 的?子集,針對?機(jī)伪煤、PDA和游戲主機(jī)等嵌?式設(shè)備而設(shè)計加袋,去除了了許多不必要和性能較低的API接口。

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

OpenGL /OpenGL ES/ Metal 在任何項(xiàng)目中解決問題的本質(zhì)就是利用GPU芯片來高效渲染圖形圖像.

比如在游戲開發(fā)中,對于游戲場景/游戲?人物的渲染
比如在?視頻開發(fā)中,對于視頻解碼后的數(shù)據(jù)渲染
比如在地圖引擎,對于地圖上的數(shù)據(jù)渲染
比如在動畫中,實(shí)現(xiàn)動畫的繪制
比如在視頻處理理中,對于視頻加上濾鏡效果

圖形API 是iOS開發(fā)者唯?一接近GPU的?方式.

二职烧、OpenGL 專業(yè)名詞解析

1.OpenGL 上下文(context)

在應(yīng)?用程序調(diào)?用任何OpenGL的指令之前,需要安排首先創(chuàng)建?一個OpenGL的 上下文防泵。這個上下文是?一個?常龐大的狀態(tài)機(jī)蚀之,保存了OpenGL中的各種狀態(tài),這也是OpenGL指令執(zhí)行的基礎(chǔ)捷泞。

OpenGL的函數(shù)不不管在哪個語言中足删,都是類似C語言?一樣的?向過程的函數(shù),本質(zhì)上都是對OpenGL上下文這個龐大的狀態(tài)機(jī)中的某個狀態(tài)或者對象進(jìn)行操作锁右,當(dāng)然你得首先把這個對象設(shè)置為當(dāng)前對象失受。因此,通過對OpenGL指令的封裝咏瑟,是可以將OpenGL的相關(guān)調(diào)?用封裝成為?一個?面向?qū)ο蟮膱D形API的拂到。

由于OpenGL上下文是?一個巨?的狀態(tài)機(jī),切換上下文往往會產(chǎn)?生較?的開銷码泞,但是不同的繪制模塊兄旬,可能需要使用完全獨(dú)立的狀態(tài)管理。因此余寥,可以在應(yīng)?程序中分別創(chuàng)建多個不同的上下文领铐,在不同線程中使?不同的上下?,上下文之間共享紋理理宋舷、緩沖區(qū)等資源绪撵。這樣的方案,會?反復(fù)切換上下文肥缔,或者?量修改渲染狀態(tài)莲兢,更加合理高效的.

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

狀態(tài)機(jī)是理理論上的?一種機(jī)器器.這個?常難以理解.所以我們把這個狀態(tài)機(jī)這么理解.狀態(tài)機(jī)描述了一個對象在其?命周期內(nèi)所經(jīng)歷的各種狀態(tài),狀態(tài)間的轉(zhuǎn)變续膳,發(fā)?轉(zhuǎn)變的動因改艇,條件及轉(zhuǎn)變中所執(zhí)?行行的活動》夭恚或者說谒兄,狀態(tài)機(jī)是一種行為,說明對象在其生命周期中響應(yīng)事件所經(jīng)歷的狀態(tài)序列以及對那些狀態(tài)事件的響應(yīng)社付。因此具有以下特點(diǎn):

  • 有記憶功能承疲,能記住其當(dāng)前的狀態(tài)
  • 可以接收輸入邻耕,根據(jù)輸入的內(nèi)容和?己的原先狀態(tài),修改?己當(dāng)前狀態(tài)燕鸽,并且可以有對應(yīng)輸出
  • 當(dāng)進(jìn)?入特殊狀態(tài)(停機(jī)狀態(tài))的時候兄世,便不再接收輸入,停?止工作;

類推到OpenGL 中來,可以這么理理解:

  • OpenGL可以記錄?己的狀態(tài)(如當(dāng)前所使用的顏色啊研、是否開啟了了混合功能等)
  • OpenGL可以接收輸入(當(dāng)調(diào)?用OpenGL函數(shù)的時候御滩,實(shí)際上可以看成 OpenGL在接收我們的輸入),如我們調(diào)?用glColor3f党远,則OpenGL接收到這個輸入后會修改?己的“當(dāng)前顏色”這個狀態(tài);
  • OpenGL可以進(jìn)?停止?fàn)顟B(tài)削解,不再接收輸入。在程序退出前沟娱,OpenGL總會先停止工作的;
3.渲染

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

4.頂點(diǎn)數(shù)組(VertexArray)和頂點(diǎn)緩沖區(qū)(VertexBuffer)
  • 畫圖一般是先畫好圖像的骨架氛驮,然后再往?架里面填充顏?,這對于 OpenGL也是一樣的济似。頂點(diǎn)數(shù)據(jù)就是要畫的圖像的骨架矫废,和現(xiàn)實(shí)中不不同的 是,OpenGL中的圖像都是由圖元組成砰蠢。在OpenGLES中磷脯,有3種類型的圖元:點(diǎn)、線娩脾、三角形。那這些頂點(diǎn)數(shù)據(jù)最終是存儲在哪?里里的呢?開發(fā)者可 以選擇設(shè)定函數(shù)指針打毛,在調(diào)?用繪制?方法的時候柿赊,直接由內(nèi)存?zhèn)?入頂點(diǎn)數(shù) 據(jù),也就是說這部分?jǐn)?shù)據(jù)之前是存儲在內(nèi)存當(dāng)中的幻枉,被稱為頂點(diǎn)數(shù)組碰声。?性能更高的做法是,提前分配?塊顯存熬甫,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng)中胰挑。這部分的顯存,就被稱為頂點(diǎn)緩沖區(qū)椿肩。

  • 頂點(diǎn)指的是我們在繪制一個圖形時,它的頂點(diǎn)位置數(shù)據(jù).而這個數(shù)據(jù)可以直接存儲在數(shù)組中或者將其緩存到GPU內(nèi)存中

5.管線

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

6.固定管線/存儲著?器
  • 在早期的OpenGL 版本,它封裝了很多種著色器程序塊內(nèi)置的?一段包含了了光照厂榛、坐標(biāo)變換盖矫、裁剪等諸多功能的固定shader程序來完成,來幫助開發(fā)者來完成圖形的渲染. ?開發(fā)者只需要傳?入相應(yīng)的參數(shù),就能快速完成圖形的渲染. 類似于iOS開發(fā)會封裝很多API,?我們只需要調(diào)用,就可以實(shí)現(xiàn)功能.不需要關(guān)注底層實(shí)現(xiàn)原理
  • 但是由于OpenGL 的使?用場景非常豐富,固定管線或存儲著?色器器無法完成每一 個業(yè)務(wù).這時將相關(guān)部分開放成可編程丽惭。
7.著?器程序Shader
  • 就全?的將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€。因此辈双,OpenGL在實(shí)際調(diào)用繪制函數(shù)之前责掏,還需要指定一個由shader編譯成的著?色器程序。常見的著色器主要有頂點(diǎn)著?器(VertexShader)湃望,?段著?器 (FragmentShader)/像素著?器(PixelShader)换衬,?何著?器 (GeometryShader),曲?細(xì)分著?器(TessellationShader)喜爷。?段著?器和像素著?器只是在OpenGL和DX中的不同叫法?已冗疮。可惜的是檩帐,直到 OpenGLES 3.0术幔,依然只支持了頂點(diǎn)著?器和?段著?器這兩個最基礎(chǔ)的著?器。
  • OpenGL在處理理shader時湃密,和其他編譯器一樣诅挑。通過編譯、鏈接等步驟泛源,?成了著?器程序(glProgram)拔妥,著?器程序同時包含了了頂點(diǎn)著?器和?段著?器的運(yùn)算邏輯。在OpenGL進(jìn)?行行繪制的時候达箍,首先由頂點(diǎn)著?色器對傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算没龙。再通過圖元裝配,將頂點(diǎn)轉(zhuǎn)換為圖元缎玫。然后進(jìn)行光柵化硬纤,將圖元這種?矢量量圖形,轉(zhuǎn)換為柵格化數(shù)據(jù)赃磨。最后筝家,將柵格化數(shù)據(jù)傳入?段著?器中進(jìn)行運(yùn)算。?段著?器會對柵格化數(shù)據(jù)中的每?個像素進(jìn)行運(yùn)算邻辉,并決定像素的顏色溪王。
8.頂點(diǎn)著?色器器VertexShader
  • 一般用來處理圖形每個頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影等)

  • 頂點(diǎn)著?器是OpenGL中用于計算頂點(diǎn)屬性的程序。頂點(diǎn)著?器是逐頂點(diǎn)運(yùn)算的程序值骇,也就是說每個頂點(diǎn)數(shù)據(jù)都會執(zhí)行一次頂點(diǎn)著?器莹菱,當(dāng)然這是并行的,并且頂點(diǎn)著?器運(yùn)算過程中?法訪問其他頂點(diǎn)的數(shù)據(jù)

  • 一般來說典型的需要計算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)變換吱瘩、逐頂點(diǎn)光照運(yùn)算等等芒珠。頂點(diǎn)坐標(biāo)由?身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)系的運(yùn)算,就是在這里里發(fā)?的搅裙。

9.片元著?器程序FragmentShader
  • 一般?來處理圖形中每個像素點(diǎn)顏?計算和填充
  • ?段著?器是OpenGL中?用于計算片段(像素)顏色的程序皱卓。片段著?器是逐像素運(yùn)算的程序裹芝,也就是說每個像素都會執(zhí)?一次片段著?器,當(dāng)然也是并?的娜汁。
10.GLSL(OpenGL Shading Language)

OpenGL著?語言(OpenGL Shading Language)是用來在OpenGL中著色編程的語言嫂易,也即開發(fā)人員寫的短小的自定義程序,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執(zhí)?行的掐禁,代替了固定的渲染管線的一部分怜械,使渲染管線中不同層次具有可編程性。比如:視圖轉(zhuǎn)換傅事、投影轉(zhuǎn)換等缕允。GLSL(GL Shading Language)的著?器代碼分成2個部分: Vertex Shader(頂點(diǎn)著?色器)和Fragment(?段著?器)

11.光柵化Rasterization
  • 是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過程,具有將圖元轉(zhuǎn)化為?個個柵格組成的圖象的作用蹭越,特點(diǎn)是每個元素對應(yīng)幀緩沖區(qū)中的一像素障本。
  • 光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過程。片元中的每一個元素對應(yīng)于幀緩沖區(qū)中的一個像素响鹃。
  • 光柵化其實(shí)是一種將幾何圖元變?yōu)槎S圖像的過程驾霜。該過程包含了兩部分的工作。第一部分工作:決定窗口坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占用;第二部分?作:分配一個顏色值和一個深度值到各個區(qū)域买置。光柵化過程產(chǎn)?的是片元粪糙。
  • 把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上?用于對應(yīng)位置的像素及用于填充像素的顏色,這個過程稱為光柵化忿项,這是?一個將模擬信號轉(zhuǎn)化為離散信號的過程蓉冈。
12.紋理

可以理解為圖片. ?家在渲染圖形時需要在其編碼填充圖片,為了使得場景更加逼真.?這里使?的圖?,就是常說的紋理.但是在OpenGL,我們更加習(xí)慣叫紋理,而不是圖片.

13.混合(Blending)

在測試階段之后,如果像素依然沒有被剔除轩触,那么像素的顏色將會和幀緩沖區(qū)中顏色附著上的顏色進(jìn)行混合洒擦,混合的算法可以通過OpenGL的函數(shù)進(jìn)行指定。但是OpenGL提供的混合算法是有限的怕膛,如果需要更更加復(fù)雜的混合算法,一般可以通過像素著?色器器進(jìn)行實(shí)現(xiàn)秦踪,當(dāng)然性能會比原?的混合算法差一些.

14.變換矩陣(Transformation)

例如圖形想發(fā)?平移,縮放,旋轉(zhuǎn)變換.就需要使用變換矩陣.

15. 投影矩陣Projection

用于將3D坐標(biāo)轉(zhuǎn)換為?維屏幕坐標(biāo),實(shí)際線條也將在二維坐標(biāo)下進(jìn)行繪制

16.渲染上屏/交換緩沖區(qū)(SwapBuffer)
  • 渲染緩沖區(qū)一般映射的是系統(tǒng)的資源比如窗口褐捻。如果將圖像直接渲染到窗口對應(yīng)的渲染緩沖區(qū),則可以將圖像顯示到屏幕上椅邓。
  • 但是柠逞,值得注意的是,如果每個窗?口只有一個緩沖區(qū)景馁,那么在繪制過程中屏幕進(jìn)行了刷新板壮,窗口可能顯示出不完整的圖像
  • 為了解決這個問題,常規(guī)的OpenGL程序至少都會有兩個緩沖區(qū)合住。顯示在屏幕上的稱為屏幕緩沖區(qū)绰精,沒有顯示的稱為離屏緩沖區(qū)撒璧。在一個緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換笨使,實(shí)現(xiàn)圖像在屏幕上的顯示卿樱。
  • 由于顯示器的刷新一般是逐行進(jìn)行的,因此為了了防止交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀硫椰,因此交換一般會等待顯示器器刷新完成的信號繁调,在顯示器兩次刷新的間隔中進(jìn)行交換,這個信號就被稱為垂直同步信號靶草,這個技術(shù)被稱為垂直同步蹄胰。
  • 使?用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進(jìn)行下一幀的渲染奕翔,使得幀率無法完全達(dá)到硬件允許的最高水平裕寨。為了解決這個問題,引入了三緩沖區(qū)技術(shù)糠悯,在等待垂直同步時帮坚,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)生時互艾,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換试和,實(shí)現(xiàn)充分利利?用硬件性能的目的。

三纫普、坐標(biāo)解析

1.OpenGL投影方式


屏幕快照 2020-02-18 下午5.09.30.png

2.OpenGL攝像機(jī)坐標(biāo)系


屏幕快照 2020-02-18 下午5.13.33.png

3.OpenGL 坐標(biāo)系(世界坐標(biāo)系, 慣性坐標(biāo)系,物體坐標(biāo)系)
屏幕快照 2020-02-18 下午5.14.39.png

4.OpenGL坐標(biāo)變換全局圖


屏幕快照 2020-02-18 下午5.16.01.png

5.用戶自定義變換與OpenGL變換


屏幕快照 2020-02-18 下午5.17.09.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阅悍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昨稼,更是在濱河造成了極大的恐慌节视,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件假栓,死亡現(xiàn)場離奇詭異寻行,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匾荆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門拌蜘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牙丽,你說我怎么就攤上這事简卧。” “怎么了烤芦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵举娩,是天一觀的道長。 經(jīng)常有香客問我,道長铜涉,這世上最難降的妖魔是什么智玻? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮骄噪,結(jié)果婚禮上尚困,老公的妹妹穿的比我還像新娘。我一直安慰自己链蕊,他們只是感情好事甜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滔韵,像睡著了一般逻谦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陪蜻,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天邦马,我揣著相機(jī)與錄音,去河邊找鬼宴卖。 笑死滋将,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的症昏。 我是一名探鬼主播随闽,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肝谭!你這毒婦竟也來了掘宪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤攘烛,失蹤者是張志新(化名)和其女友劉穎魏滚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坟漱,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鼠次,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芋齿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腥寇。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沟突,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捕传,我是刑警寧澤惠拭,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響职辅,放射性物質(zhì)發(fā)生泄漏棒呛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一域携、第九天 我趴在偏房一處隱蔽的房頂上張望簇秒。 院中可真熱鬧,春花似錦秀鞭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尊勿。三九已至,卻和暖如春豆巨,著一層夾襖步出監(jiān)牢的瞬間剩辟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工往扔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贩猎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓萍膛,卻偏偏與公主長得像吭服,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卦羡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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