1、OpenGL - 專業名詞解析

1、OpenGL - 專業名詞解析

 

業界常說的兩本書:
紅寶書: 《OpenGL編程指南》
藍寶書:《OpenGL超級寶典》

 

1、圖形API

1.1、OpenGL

(Open Graphics Library)是一個誇編輯語言、跨平臺的編程圖形程序接口。他將計算機的資源抽象成爲一個OpenGL的對象,對這些資源的操作抽象爲一個個的OpenGL的指令。
主要針對的是在PC 端解決圖像渲染

 

1.2、OpenGL ES

(OpenGL for Embedded Systems)是OpenGL 三維圖形API 的子集。針對手機、PDA 和遊戲主機等嵌入式設備而設計,去除了許多不必要和性能較低的API 接口。
針對的是移動端解決圖像渲染

 

1.3、DirectX

是由很多API 組成的,DirectX 並不是一個單純的圖形API。最重要的是DirectX 是屬於Windows 上一個多媒體處理框架。並不支持Windows以外的平臺,所以不是跨平臺框架,按照性質分類,可以分爲四大部分。分別是:

  1. 顯示、
  2. 聲音、
  3. 輸入、
  4. 網絡。

 

1.4、Metal

Apple 爲遊戲開發者推出的新的平臺技術 Metal,該技術能夠爲3D 圖像提高10倍的渲染性能。Metal 是Apple 爲了瞭解3D 渲染而推出的框架。

圖形API 目的是解決一些問題:

  • 比如在遊戲開發中,對於遊戲場景/遊戲人物的渲染
  • 比如在音視頻開發中,對於視頻解碼後的數據渲染
  • 比如在地圖引擎,對於地圖上的數據渲染
  • 比如在動畫中,實現動畫的繪製
  • 比如在視頻處理中,對於視頻加上濾鏡效果

OpenGL、OpenGL ES 、 Metal 在任何項目中解決問題的本質就是利用GPU 芯片來高效渲染圖形圖像。圖形API 是iOS開發者唯一接近GPU 的方式。

 

2、OpenGL

2.1、狀態機

狀態機是理論上的一種極其。狀態機描述了一個對象在其生命週期內所經歷的各種狀態,狀態間轉變,發生轉變的原因,條件及轉變中執行的活動。或者說,狀態機是一種行爲,說明對象在其生命週期中相應事件所經歷的狀態序列以及對那些狀態事件的相應。

OpenGL 狀態機。類推到OpenGL中來,可以這麼理解:
OpenGL 可以記錄自己的狀態(如OpenGL 函數的時候,實際上可以看成OpenGL 在接收我們的輸入),如我們調用GLColor3f,則OpenGL接收到這個輸入後會修改自己的“當前顏色”這個狀態;
OpenGL 可以進入停止狀態,不在接收輸入。在程序退出前,OpenGL 總會先停止工作的。

小結:

  • 記憶功能,保存當前狀態
  • 接收輸入,修改當前狀態,或根據當前狀態進行輸出
  • 當進入特殊狀態(停機狀態)時,不再接收輸入,停止工作

 

2.2、上下文(context)

在應用程序調用任何OpenGL 的指令之前,首先需要創建一個OpenGL 的上下文。這個上下文是一個非常龐大的狀態機,保存了OpenGL 中的各種狀態,這也是OpenGL 指令執行的基礎。

OpenGL 的函數不管在哪個語言中,都是類似C 語言一樣的面向過程的函數。本質上都是對OpenGL 上下文這個龐大狀態機中的某個狀態或者對象進行操作(這個對象要設置爲當前對象)。可以將OpenGL 的相關調用封裝成爲一個面向對象的圖形API。

由於 OpenGL 上下文是一個巨大的狀態機,切換上下文往往會產生較大的開銷,但是不同的繪製模塊,可能需要使用功能完全獨立的狀態管理。因此,可以在應用管理程序中分別創建多個不同的上下文,在不同線程中使用不同給的上下文,上下文之間共享紋理,緩衝區等資源。這樣的方案,會比反覆切換上下文,或者大量修改渲染狀態,更加合理高效。

小結:

  • OpenGL:指令執行的基礎,是一個非常龐大的狀態機
  • OpenGL 上下文切換開銷大。雖然可能使用多個上下午,但上下文之間會共享紋理,緩衝區等資源。
  • OpenGL 的函數雖然是面向過程的,但可以把相關的調用封裝爲面向過程的圖形API。

 

3、渲染

將圖形 / 圖像數據轉換成2D空間圖像操作叫做渲染(Rendering)。

 

4、頂點數組(VertexArray)和頂點緩衝區(VertexBuffer)

頂點數據就是圖像的輪廓。OpenGL 中的圖像都是由圖元組成。在OpenGL ES中,有3種類型的圖元:點、線、三角形。
在調用繪製方法的時候,直接由內存傳入頂點數據,也就是說這個部分數據之前是存儲在內存當中的,被稱爲頂點數組(VertexArray)。
而性能更高的做法是,提前分配一塊顯存,將頂點數據預先傳入到顯存當中。這部分的顯存,就被稱爲頂點緩衝區(VertexBuffer)。
頂點值得是我們在繪製一個圖形時,他的頂點位置數據。而這個數據可以直接存儲在數組中或者將其緩存在GPU 內存中

小結:

  • 3種(只有這3種)類型的圖元:點、線、三角形。
  • 頂點數組(VertexArray)在內存中。
  • 頂點緩衝區(VertexBuffer)在緩存中。

 

5、管線

在OpenGL 下渲染圖形,就會經歷一個一個的節點。而這樣的操作可以理解爲管線。就像一個流水線,任務按照先後順序依次執行。管線是一個抽象的概念,之所以稱之爲管線是因爲顯卡在處理數據的時候是按照一個固定的順序來的,而且嚴格按照這個順序。就像水從一根管子的一端流到另一端,這個順序是不能打破的。
核心要點:
任務嚴格按照順序依次執行。

 

6、固定管線 / 存儲着色器

在早期的OpenGL 版本,封裝了多種着色器程序塊,內置了一個段包含了光照、座標變換、裁剪等諸多功能的固定shader 程序來完成。來幫助開發者來完成圖形的渲染,開發者只需要傳入相應的參數,就能快速完成圖形的渲染。類似於iOS開發會封裝很多API,而我們只需要調用,就可以實現功能,不需要關注底層實現原理。
但是由於OpenGL 的使用場景非常豐富,固定管線或存儲着色器無法完成每一個業務,這就將相關部分開發成可編輯

小結:

  • 早期的OpenGL 版本封裝的輔助快速開發的着色器程序塊。
  • 由於提供的功能有限,後期編程了可編輯的形式。

 

7、着色器程序(Shader)

將固定渲染管線架構變成可編程渲染管線。
OpenGL 在實際調用繪製函數之前,還需要指定一個由shader 編程成的着色器程序。

常見的着色器主要有:

  • 頂點着色器(VertexShader)
  • 片段着色器(FragmentShader)或叫 像素着色器(PixelShader)
  • 幾何着色器(GeometryShader)
  • 曲面細分着色器(TessellationShader)

片段着色器和像素着色器只是在OpenGL 和 DX 中的不同叫法而已。可惜的是,直到OpenGL ES 3.0,OpenGL ES 依然只支持 頂點着色器 和 片段着色器 這兩個最基礎的着色器。

OpenGL 在處理 shader 時,和其他編譯器一樣。通過編譯、連接等步驟,生成了着色器程序(GLProgram),着色器程序同時包含了頂點着色器 和 片段着色器 的運算邏輯。在OpenGL 進行繪製的時候,首先由頂點着色器對傳入的頂點數據進行運算。在通過圖元裝配,將頂點轉換爲圖元。然後進行光柵化,將圖元這種矢量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入片段着色器中進行運算。片段着色器會對柵格化數據中的每一個像素進行運算,並決定像素的顏色。

小結:

  • 將固定渲染管線架構變爲了可編程渲染管線
  • 常見的着色器主要有頂點着色器,片段着色器/像素着色器,幾何着色,曲面細分着色。
  • OpenGL ES只支持 頂點着色器 和 片段着色器
  • OpenGL 通過編譯、連接等步驟,將生成着色器程序。
  • 在OpenGL 進行繪製的時候,由頂點着色器對傳入的頂點數據進行運算。通過圖元裝配,將頂點轉換爲圖元。之後進行光柵化,將圖元這種適量圖形,轉換爲柵格化數據。最後柵格化數據傳入片段着色器中進行運算,片段着色器會對柵格化數據中每一個像素進行運算,並決定像素的顏色。

 

7.1、頂點着色器(VertexShader)

一般用來處理圖形每個頂點變換(旋轉/平移/投影等)
頂點着色器是OpenGL 中用於計算頂點屬性的程序。頂點着色器是逐頂點運算的程序,也就是說每個頂點數據都會執行一次頂點着色器。當然這是並行的,並且頂點着色器運算過程中無法訪問其他頂點的數據。
一般來說典型的需要計算的頂點屬相主要包括頂點座標變換、逐頂點光照運算等等。頂點座標由自身座標系統轉換爲歸一化座標系的運算,就是在這裏發生的。

小結:

  • 一般用來處理圖形每個頂點變換(旋轉/平移/投影等)
  • 並行計算,且運算過程中無法訪問其他頂點的數據。

 

7.2、片段着色器(FragmentShader)

一般用來處理圖形彙總每個像素點顏色計算和填充
片段着色器是OpenGL 中用於計算片段(像素)顏色的程序。片段着色器是逐像素運算的程序,也就是說每個像素都會執行一次片段着色器,當然也是並行的。

小結:

  • 一般用來處理圖形彙總每個像素點顏色計算和填充
  • 並行計算,且運算過程中無法訪問其他頂點的數據

補充:
jpg png 這些都是壓縮圖片
圖片顯示 ->  位圖
例如,120 * 120 的圖片 =  14400 個像素點, 每個像素點都有R B G alpha 透明度 各是8位 總共 4 個字節 = 14400 * 4


8、GLSL(OpenGL Shading Language)

GLSL 着色語言是用在OpenGL 中着色編程的語言,是在圖形卡的GPU 上執行的。代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編譯性。比如:視圖轉換、投影轉換等。
GLSL 的着色器代碼分爲2個部分Vertex Shader(頂點着色器) 和 Fragment(片元着色器)

 

9、光柵化(Rasterization)

光柵化就是把頂點數據轉換爲片元的過程。具有將圖轉化爲一個個柵格組成的圖像的作用,特點是每個元素對應幀緩衝區中的一個像素。
光柵化其實是將幾何圖元變爲二維圖像的過程。該過程包含了兩部分的工作。第一部分工作:決定窗口座標中的哪些整形柵格區域被基本圖元佔用;第二部分:分配一個顏色值和一個深度值到各個區域。光柵化過程產生的是片元
把物體的數學描述以及物體相關的顏色信息轉換爲屏幕上用於對應位置的像素及用於填充像素的顏色,這個過程稱爲光柵化。這是一個將模擬信號轉化爲離散信號的過程。

小結:

  • 光柵化就是把頂點數據轉換爲片元的過程。
  • 該過程包含了兩部分的工作:
  • 決定窗口座標中的哪些整形柵格區域被基本圖元佔用;
  • 分配一個顏色值和一個深度值到各個區域。

光柵化有兩個過程

  1. 確定圖形在像素範圍
  2. 顏色附着上

 

10、紋理(Texture)

紋理可以理解爲圖片。在渲染圖形時需要在頂點圍成的區域中填充圖片,使得場景更加逼真。而這裏使用的圖片,就是常說的紋理。只是在OpenGL,我們更加習慣叫紋理,而不是圖片。

 

11、混合(Blending)

在測試階段之後,如果像素依然沒有被剔除,那麼像素的顏色將會和幀緩存區中顏色附着上的顏色進行混合,混合的算法可以通過OpenGL 的函數進行指定。但是OpenGL 提供的混合算法有限。如果需要更加複雜的混合算法,一般可以通過像素着色器進行實現,當然性能會比原生的混合算法差一些

 

12、矩陣

12.1、變換矩陣(Transformation)

例如圖形想發生平移、縮放、旋轉等變換,就需要使用變換矩陣。

 

12.1、投影矩陣(Projection)

用於將3D 座標轉換爲二維屏幕座標,實際線條也將在二維座標下進行繪製。

 

13、渲染上屏/交換緩衝區(SwapBuffer)

渲染緩衝區一般映射的是系統的資源比如窗口。如果將圖像直接渲染到窗口對應的渲染緩衝區,則可以將圖像顯示到屏幕上。
值得注意的是,如果每個窗口只有一個緩衝區,那麼在繪製過程中屏幕進行了刷新,窗口可能顯示出不完整的圖像。
爲了解決這個問題,常規的OpenGL 程序至少都會有兩個緩衝區。顯示在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區。在一個緩衝區渲染完成之後,通過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上顯示。
由於顯示器的刷新一般是逐行進行的,因此爲了防止交換緩衝區的時候屏幕上下區域的圖像分屬於兩個不同的幀,交換一般會等待顯示器刷新完成的信號,在顯示器兩次刷新的間隔中進行交換,這個信號就被稱爲垂直同步信號,這個技術被稱爲垂直同步。
使用了雙緩衝區和垂直同步技術之後,由於總是要等待緩衝區交換之後再進行下一幀的渲染,使得幀率無法完全達到硬件允許的最高水平。爲了解決這個問題,引入了三緩衝區技術。在等待垂直同步時,來回交替渲染兩個離屏的緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區交換,實現充分利用硬件性能的目的。

小結:

  • 如果每個窗口只有一個緩衝區,若在繪製過程中屏幕進行了刷新,窗口可能顯示出不完整的圖像。爲了解決這個問題,常規的OpenGL 程序至少都會有兩個緩衝區。

 

  • 垂直同步:由於顯示器的刷新一般是逐行進行的,爲了防止交換緩衝區的時候屏幕上下區域的圖像分屬於兩個不同的幀,交換一般會等待顯示器刷新完成的信號,在顯示器兩次刷線的時間中進行交換,這個信號就被稱爲垂直信號,這個技術被稱爲垂直同步。

 

  • 三緩衝區技術:使用了雙緩衝區和垂直同步技術之後,由於總是要等待緩衝區交換之後再進行下一幀的渲染,使得幀率無法完全達到硬件允許的最高水平。爲了解決這個問題,引入了三緩衝區技術。在等待垂直同步時,來回交替渲染兩個離屏的緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區交換,實現充分利用硬件性能的目的

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章