本篇,我會初步介紹OpenGL在繪圖中的角色定位李命,以及相關(guān)專業(yè)名詞的介紹侄非。在部分專業(yè)名詞后面我都附有較詳細(xì)的解說連結(jié)蕉汪,若為初學(xué)請先理解本篇概觀流译,再往細(xì)節(jié)深入。
什么是OpenGL? OpenGL本質(zhì)上是驅(qū)動GPU繪圖的一套框架者疤。
作為底層驅(qū)動GPU繪圖的框架福澡,OpenGL可以達(dá)到跨平臺的特性。在iOS里面CoreGraphics, CoreAnimation, CoreImage計算繪圖后驹马,最后其實也是要調(diào)度OpenGL/Metal去驅(qū)動GPU繪制革砸。同理,Android & Windows也是在調(diào)度OpenGL基礎(chǔ)上提供繪圖API給開發(fā)者使用糯累。
由上圖可知算利,所有圖像最終會由OpenGL調(diào)動GPU繪制,那么問題來了泳姐,我們有什么理由需要去寫底層的OpenGL而不直接用上層所提供的繪圖API繪制就好了呢效拭?
效能考量:上層API主要是利用CPU資源繪圖,OpenGL則是透過GPU繪圖胖秒。在用途上缎患,CPU是串行運算,善于處理依賴性高的任務(wù)阎肝、GPU是并行運算挤渔,適合處理依賴性低的任務(wù)。而屏幕上各像素點結(jié)果的運算风题,互相之間是不依賴的判导,因此OpenGL可以達(dá)到更高效的運算結(jié)果。
跨平臺共用:同樣的著色器代碼沛硅,可以同時提供android & iOS平臺使用眼刃。
自定義效果:上層繪圖我們受限于iOS提供的API,人家沒有提供的效果稽鞭,我們無法實現(xiàn)鸟整。而OpenGl我們可以自定義著色器編寫我們想要的特效。
專業(yè)名詞解析
1. OpenGL 上下? ( Context )
OpenGL的上下文是一個巨大的狀態(tài)機朦蕴。保存了OpenGL中的各種狀態(tài)篮条,也是OpenGL指令執(zhí)?的基礎(chǔ)。
任何畫面在被呈現(xiàn)出來之前吩抓,都要經(jīng)過一系列的渲染處理涉茧。而這渲染過程中是否開啟光照計算、顏色混合疹娶、深度測試等伴栓,就是由上下文中儲存的狀態(tài)決定。
2. OpenGL 狀態(tài)機(State Machine)
狀態(tài)機可以理解為一臺可以保存狀態(tài),并根據(jù)當(dāng)前狀態(tài)進(jìn)行相應(yīng)輸出的機器钳垮,他具有以下特性惑淳。
記憶功能,保存當(dāng)前狀態(tài)
接收輸入饺窿,修改當(dāng)前狀態(tài)歧焦,或根據(jù)當(dāng)前狀態(tài)進(jìn)行輸出
當(dāng)進(jìn)?特殊狀態(tài)(停機狀態(tài))時,不再接收輸?肚医,停?工作
3. 頂點數(shù)組( VertexArray ) 與圖元(primitive)
頂點數(shù)據(jù)決定圖像的輪廓绢馍,圖元裝配方式?jīng)Q定頂點的連線方式,最終形成圖元肠套。
在OpenGL里面舰涌,圖元是形成圖像的基本單位,共有三種類型:點你稚、線瓷耙、三角形。
頂點只能決定位置刁赖、圖元裝配方式才能決定圖形的樣子哺徊。補充三角形圖元裝配方式詳解
5. 管線(Pipeline)
管線就是圖形渲染的流程,下圖為OpenGL 4.3 版本的管線乾闰。之所以稱之為管線是因為顯卡在處理理數(shù)據(jù)的時候是按照一個固定的順序來的,?且嚴(yán)格按照這個順序盈滴。
本篇中只會重點介紹 "頂點著色器" 以及 "片元著色器" 涯肩,因為實際上,目前OpenGL只開放了這兩種著色器給開發(fā)者自行編程巢钓。[各著色器職責(zé)詳解補充]
6. 頂點著色? (VertexShader)
頂點著?器是OpenGL中?于計算頂點屬性的程序病苗。用以呈現(xiàn)旋轉(zhuǎn)/平移/投影等,是我們唯二能夠以GLSL自定義的著色器症汹。
頂點著?器是逐頂點運算的程序硫朦,也就是說每個頂點數(shù)據(jù)都會執(zhí)?一次頂點著?器。當(dāng)然這是并行的背镇,并且頂點著?器運算過程中?法訪問其他頂點的數(shù)據(jù)咬展。
7. 片段著?器(FragmentShader)
?段著?器是OpenGL中?于計算?段(像素)顏?的程序。用以呈現(xiàn)陰影瞒斩、高光破婆、半透明、深度等胸囱,也是我們唯二能夠以GLSL自定義的著色器祷舀。
?段著?器是逐像素運算的程序,也就是說每個像素都會執(zhí)?一次?段著?器,當(dāng)然也是并?的裳扯。
片元中的每一個元素對應(yīng)幀緩沖區(qū)中的?像素抛丽。
片段著色器又稱為片元著色器、像素著色器饰豺。
8. 光柵化(Rasterization)
頂點經(jīng)過圖元裝配產(chǎn)生的圖元會傳給光柵器亿鲜,光柵器再將圖元轉(zhuǎn)換為片元,這個過程稱為光柵化哟忍。
這個過程包含兩部分工作狡门。第?部分工作:決定窗?坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占?;第?部分?作:分配一個顏?值和?個深度值到各個區(qū)域锅很。示意圖如下:
9. 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(頂點著?器)和Fragment(?段著色器)
10. 紋理(Texture)
紋理可以理解為圖?。 在渲染圖形時需要在頂點圍成的區(qū)域中填充圖?翘簇,使得場景更加逼真撬码。?這?使?的圖?,就是常說的紋理版保。只是在OpenGL呜笑,我們更加習(xí)慣叫紋理,?不是圖?彻犁。
11. 混合(Blending)
在測試階段之后叫胁,如果像素依然沒有被剔除,那么像素的顏?將會和幀緩沖區(qū)中顏?附著上的顏色進(jìn)?混合汞幢,混合的算法可以通過OpenGL的函數(shù)進(jìn)行指定驼鹅。但是OpenGL提供的混合算法有限。如果需要更加復(fù)雜的混合算法森篷,一般可以通過片段著?器進(jìn)?實現(xiàn)输钩,當(dāng)然性能會?原?的混合算法差?些。
12.矩陣(Matrix)
矩陣是一種數(shù)據(jù)結(jié)構(gòu)仲智,是OpenGL應(yīng)用來改變頂點位置的主要方式张足,依功能分為 "表示位置的矩陣(頂點 與 模型數(shù)據(jù))", "表示位置如何變換的矩陣(變換矩陣)"。
OpenGL最終的頂點位置是由 投影矩陣,視圖矩陣,模型矩陣 共同決定的坎藐。[矩陣章節(jié)]
最終頂點 = 投影矩陣 * 視圖矩陣 * 模型矩陣 * 頂點