OpenGL中那些晦澀難懂的名詞芳撒、動詞
對于初次接觸圖形處理學(xué),第一個難關(guān)就是要面對大量晦澀難懂的概念未桥,而這些概念也是學(xué)習(xí)OpenGl的第一道門檻笔刹,畢竟這是歪果仁提出的概念,及時翻譯過后也會有一些不好理解的地方冬耿。本文中我將重點解釋一些我自己的理解舌菜,如有偏差可以再下方交流指正。
-
GPU
說起圖形處理亦镶,一定是離不開GPU的日月,因為我們所做的操作袱瓮,最終都會由GPU負責(zé)展示到監(jiān)視器上。而這個過程中就離不開計算爱咬,計算每一個像素點的顏色信息尺借。所以GPU是計算圖像數(shù)據(jù)的單元。
說起計算精拟,在我的理解里CPU就是專門用于做二進制運算的計算單元燎斩、控制單元,可以處理復(fù)雜的邏輯和依賴蜂绎,那為什么還需要GPU呢栅表?
- 現(xiàn)在的顯示內(nèi)容越來越復(fù)雜(多邊形、3d师枣、光影怪瓶、甚至是動態(tài)的圖像內(nèi)容),僅僅靠CPU及做圖像數(shù)據(jù)的計算践美,還要做其他工作洗贰,設(shè)備使用起來就會非常卡頓陨倡。
- 基于GPU的特性(圖形運算單元):擅長通過并行的方式來進行數(shù)學(xué)計算哆姻,讓我想起了為什么要使用GPU來進行比特幣的“挖礦”操作了。
所以將邏輯計算交給CPU玫膀,將圖像運算交給GPU矛缨。合理分工,最大程度的提高計算機的性能帖旨。 -
通過硬件的角度分析一下兩者的不同:CPU中有計算單元箕昭、也有控制單元,必然導(dǎo)致并發(fā)執(zhí)行能力會比較弱解阅,拋開多核來講落竹,cpu的并發(fā)其實是通過時間片切換來實現(xiàn)的,并不是真正意義上的并發(fā)但是CPU货抄。而GPU中有大量的計算單元述召,可以真正意義的并發(fā)進行數(shù)學(xué)計算,但是并不擅長處理邏輯和依賴蟹地。
-
OpenGL
- 首先要知道的是OpenGL是一種跨平臺积暖、跨語言的API規(guī)范,也可以簡單的理解為一套協(xié)議(沒有看到網(wǎng)上有這種解讀怪与,不知道對不對)夺刑。其中規(guī)定了可以操作哪些圖像、圖形API。開發(fā)者就可以通過這套API規(guī)范在各種平臺上操作GPU來實現(xiàn)一些功能遍愿。更加嚴謹?shù)恼f是GPU必須提前滿足OpenGL規(guī)范才可以存淫。
- OpenGL本身是規(guī)范,但是想要在具體的平臺沼填、語言下使用還是需要有對應(yīng)的API實現(xiàn)的桅咆。所以說我們用是OpenGL的實現(xiàn)。
-
OpenGL ES
它是OpenGL的三維圖形子子集坞笙,主要是為了滿足:iphone岩饼、ipad等便攜式設(shè)備的特性。作為子集一定是拋棄了很多無需且低效的API羞海,來滿足便攜式設(shè)備的特點。
-
Metal
是蘋果自己開發(fā)的一套用來替換OpenGL ES
的API曲管,目的都是為了讓GPU來做事情却邓。畢竟是用別人的規(guī)范會有很多限制,蘋果大大也不會甘愿受制于人院水。而且在OpenGL ES的基礎(chǔ)上做了很多優(yōu)化腊徙,使得3D渲染能力提升了10倍,并且與2018年開始全面使用檬某。
-
狀態(tài)機
狀態(tài)機就是保存對象在整個生命周期中的各種狀態(tài)撬腾、所需參數(shù),同樣也可以通過狀態(tài)機來進行狀態(tài)恢恼、參數(shù)的修改民傻。
舉例
狀態(tài)機就像是一臺微波爐,它有時間场斑、溫度漓踢、模式等各種參數(shù),當然它也掌握著內(nèi)部食物的加熱漏隐、熟沒熟等情況喧半。你可以通過微波爐來調(diào)解你需要的加熱方式、時間青责,你也可以通過微波爐的面板來知曉選擇了哪種加熱方式挺据、時間,等食物加熱完成后會有提示音來告訴你當前食物已經(jīng)加熱完成脖隶。
當然如果你加熱完成后沒有將各種參數(shù)重置扁耐,下次加熱依舊會使用之前的各種參數(shù)。如果你開啟后沒有關(guān)閉产阱,微波爐也會一直處于工作狀態(tài)做葵。
類比狀態(tài)機也是一樣需要你在開始工作之前,進行各種參數(shù)的設(shè)定心墅,在任務(wù)完成后需要手動關(guān)閉它酿矢。
-
OpenGl上下文
- 通過資料知道OpenGl上下文是一個巨大的狀態(tài)機榨乎,其中保存著各種OpenGl工作所需的各種參數(shù)以及狀態(tài)。
- 你所寫的當前程序是一個窗口瘫筐,一個窗口對應(yīng)一個上下文蜜暑,而最終都要交付給GPU去處理。
- 根據(jù)圖可以看出上下文可以共享GPU的緩存等資源
graph TD
c(客戶端1) --> b(OpenGL上下文1)
e(客戶端2) --> d(OpenGL上下文2)
g(客戶端3) -->f(OpenGL上下文3)
b --> a[GPU]
d --> a[GPU]
f --> a[GPU]
-
渲染
將可以用于展示的圖片策肝、視頻肛捍、可視化控件,繪制到屏幕上的過程之众,其中還包含了圖片的編碼拙毫、解碼工作。這一系列過程叫做渲染棺禾,我理解應(yīng)該是一個動詞缀蹄。
-
圖元
首先需要明確一個概念圖元
,在OpenGl中圖元包含:點膘婶、線缺前、三角形。也就是說我們看到的任何圖形都是由這三個基本元素組成的悬襟。
-
頂點數(shù)組衅码、頂點緩存區(qū)
- 我們看到的圖形都是通過三種圖元組合完成的,而所有圖元的頂點之和就是
頂點數(shù)據(jù)
脊岳。 - 將頂點數(shù)據(jù)保存到內(nèi)存中逝段,就稱為
頂點數(shù)組
。 - 將頂點數(shù)據(jù)保存到GPU的顯存中割捅,就稱為
頂點緩存區(qū)
-
管線
從圖片到顯示在屏幕上需要一個過程惹恃。管線就是規(guī)定了整個過程的每一步,并且需要嚴格遵守棺牧。最貼切的比喻就是工廠里的流水線
巫糙,很好理解。
這就是OpenGL中一個完成的管線流程颊乘。
在最后一步測試與混合
中参淹,實際進行了以下幾步的操作。
固定管線
在OpenGL的早期乏悄,提供了很多API來幫助開發(fā)者快速完成渲染流程浙值。開發(fā)者只需要根據(jù)API傳入對應(yīng)的參數(shù)即可,其實就是在使用一些已經(jīng)創(chuàng)建好的shader(著色器)
檩小,但是由于應(yīng)用場景太過單一开呐,適用范圍非常有限。
可編程管線
- 通過發(fā)現(xiàn)固定管線的問題,繼而推出了可編程管線筐付,可以在某些位置進行一些自定義編程操作卵惦。
- 其實放開自定義功能的只有管線中的頂點著色器、片元(片段)著色器瓦戚。相信以后會開放更多沮尿。
-
著色器shader
在管線的解釋中已經(jīng)遇到過shader(著色器)
這個概念,每種著色器對應(yīng)著不同功能模塊较解。
- 頂點著色器:負責(zé)對頂點數(shù)據(jù)進行加工畜疾,將頂點信息放入屏幕中
- 圖元裝配:將所有頂點進行連線
- 幾何著色器:將已有圖形按照圖元分解
- 光柵化:找出所有相關(guān)的像素點,把顏色附著上去
- 片元著色器:對每一個像素點進項顏色處理
固定著色器
和固定管線類似印衔,都是提供編程好的API供開發(fā)者調(diào)用
自定義著色器
就是可以供開發(fā)者可以使用GLSL
自定義一些著色器啡捶,其實也只有:頂點著色器、片元著色器
頂點著色器
可以自定義開發(fā)的著色器奸焙,可以將頂點信息進行編程瞎暑。提現(xiàn)在圖像的:位置移動、縮放忿偷、旋轉(zhuǎn)金顿、2D <-> 3D之間的坐標轉(zhuǎn)換臊泌。
片元著色器
可以自定義開發(fā)的著色器鲤桥,可以對每一個像素點進行編程,比如說圖片的銳化度渠概、亮度茶凳、飽和度調(diào)整等。
-
GLSL(OpenGL Shading Language)
- GLSL其使用C語言作為基礎(chǔ)高階著色語言播揪,避免了使用匯編語言或硬件規(guī)格語言的復(fù)雜性贮喧。
- 使用GLSL對頂點著色器、片元著色器進行自定義編程的編程語言
-
光柵化
就是將幾何圖形轉(zhuǎn)化為二維圖像(位圖)猪狈,包含兩個步驟:
1.確定哪些像素點被使用箱沦, 將幾何圖元信息轉(zhuǎn)化為像素信息,最終獲得位圖雇庙。
-
分配一個顏?值和?個深度值到每個區(qū)域(片元著色器)谓形。
所有的格子就是光柵化第一步確定的,然后會分配一個顏色到柵格區(qū)疆前。
所有的格子就是光柵化第一步確定的寒跳,然后會分配一個顏色到柵格區(qū)。
-
紋理(Texture)
紋理可以理解為圖?竹椒。 在渲染圖形時需要在頂點圍成的區(qū)域中填充圖?童太,使得場景更加逼真。?這?使?的圖?,就是常說的紋理书释。只是在OpenGL翘贮,我們更加習(xí)慣叫紋理,?不是圖?征冷。
-
混合
根據(jù)字面意思理解就是將多種顏色合成一種择膝,而這個合成后的顏色是需要進行計算的。OpenGL中已經(jīng)提供了一些固定的混合算法检激,但是平時開發(fā)中也會使用自定義片元著色器來完成肴捉,但是效率會比固定混合算法差一些。
-
變換矩陣
在OpenGL中想要圖形發(fā)生平移叔收、縮放齿穗、旋轉(zhuǎn)就需要變換矩陣進行計算。
-
投影矩陣
- 在OpenGL中想要3D坐標轉(zhuǎn)換為2D坐標饺律,就需要投影矩陣進行計算窃页。
- 而結(jié)果是由
觀察者(camera)
的位置、以及圖像位置
本身兩者共同決定的复濒。所以想要移動一個圖像位置脖卖,既可以移動觀察者、也可以移動圖像本身巧颈。
-
顯示流程
由CPU進行邏輯計算處理->將數(shù)據(jù)傳遞給GPU->通過計算單元并行計算后->存入幀緩存區(qū)(顯存)->由視頻控制器將計算好的位圖信息讀取出來->數(shù)模轉(zhuǎn)換(數(shù)字信號轉(zhuǎn)為電子信號)->顯示器顯示