【OpenGL入門】OpenGL中的名詞解析與渲染流程

1 簡介

OpenGL(Open Graphics Library)是一個跨編程語言、跨平臺的圖形編程程序接口,它將計算機的資源抽象成一個個OpenGL對象,將對這些資源的操做抽象成一個個OpenGL指令算法

OpenGL ES(OpenGL for Embedded System)是OpenGL三維圖形API的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計,去除了不少沒必要要的和性能較低的API接口。編程

1.1 OpenGL上下文(Context)

在應用程序調用任何OpenGL的指令以前,須要安排首先建立一個OpenGL的上下文。這個上下文是一個很是龐大的狀態機,保存了OpenGL中的各類狀態,這也是OpenGL指令執行的基礎。數組

OpenGL的函數無論在哪一個語言中,都是相似C語言同樣面向過程的函數,本質上都是對OpenGL上下文這個龐大的狀態機中的某個狀態或者對象進行操做,固然你得首相把這個對象設置爲當前對象。所以,經過對OpenGL指令的封裝,是能夠將OPenGL的相關調用封裝成爲一個面向對象的圖形API的。緩存

因爲OpenGL上下文是一個巨大的狀態機,切換上下文每每會產生較大的開銷,可是不一樣的繪製模塊,可能須要使用徹底獨立的狀態管理。所以,能夠在應用程序中分別建立多個不一樣的上下文,在不一樣線程中使用不一樣的上下文,上下文之間共享紋理,緩衝區等資源。這樣,會比反覆切換上下文,或者大量修改渲染狀態,更加合理高效。markdown

1.2 OpenGL狀態機

  • 具備記憶功能,可以記錄當前的狀態
  • 能夠接收輸入,根據輸入的信息修改本身當前的狀態,並支持輸出
  • 當進入停機狀態時,便再也不接收輸入信息,中止工做。

在程序退出前,OpenGL總會先中止工做的。架構

2 着色器的渲染流程

(1) 頂點數據編程語言

(2) 頂點着色器【必要】:接收頂點數據,單獨處理每一個頂點函數

(3) 細分着色器【可選】:描述物體的形狀,在管線中⽣生成新的幾何體處理(平順)模型 生成最終狀態 (名稱: 細分控制着⾊器/細分計算着⾊器,對全部的圖像進行修改幾何圖元類型或者放棄全部的凸緣)性能

(4) 幾何着色器測試

(5) 圖元設置

(6) 剪切:剪切視口以外的繪製

(7) 光柵化:輸入圖元的數學描述,轉化爲與屏幕對應位置的像素片元,簡稱光柵化

(8) 片元着色器【必選】:片元顏色以及深度值,而後傳遞到片元測試和混合模塊

(9) 顯示效果

2.1 渲染

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

在渲染過程當中,必須存儲2中着色器,分別是頂點着色器和片元着色器。頂點着色器是第一個,片元着色器是最後一個。頂點着色器中處理頂點,片元着色器處理像素顏色。

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

  • 畫圖通常是先畫好圖像的骨架,而後再往骨架中填充顏色,OpenGL也是同樣的,頂點數據就是要畫的圖像的骨架,和現實中不一樣的是,OpenGL中的圖像都是由圖元組成。在OpenGL ES中,有三種類型的圖元:點、線、三角形。開發者能夠選擇設定函數指針,在調用繪製方法的時候,直接由內存傳入頂點數組。而性能更高的作法是,提早分配一塊顯存,將頂點數據預先傳入到顯存當中。這部分顯存,就被稱爲頂點緩衝區
  • 頂點指的是咱們在繪製一個圖形的時候,他的頂點位置數據,這個數據能夠直接存儲在數組中或者將其直接緩存到GPU內存中

2.3 着色器程序(Shader)

  • 就全面的將固定渲染管線架構變爲了可編程渲染管線。所以OpenGL在實際調用繪製函數以前,還須要指定一個由shader編譯成的着色器程序。常見的着色器主要有頂點着色器(VertexShader)片斷着色器(FragmentShader)/像素着色器(PixelShader),幾何着色器(GeometryShader)曲面細分着色器(TessellationShader)片斷着色器像素着色器只是在OpenGLDX中的不一樣叫法而已。惋惜的是,直到OpenGL ES 3.0,依然只支持了頂點着色器片斷着色器這兩個最基礎的着色器。
  • OpenGL在處理Shader時,和其餘編譯器同樣。經過編譯、連接等步驟,生成了着色器程序(glProgram),着色器程序同時包含了頂點着色器片斷着色器的運算邏輯。在OpenGL進行繪製的時候,首先由頂點着色器對傳入的頂點數據進行運算。再經過圖元裝配,將頂點轉換爲圖元。而後進行光柵化,將圖元這種矢量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入片斷着色器中進行運算。片斷着色器會對柵格化數據中的每個像素進行運算,並決定像素的顏色。

2.4 管線

在OpenGL下渲染圖形,就會有經歷一個一個節點,這樣的操做能夠理解爲管線。就像流水線同樣,每一個任務相似流水線通常執行,任務之間有前後順序。管線是一個抽象概念,之因此稱之爲管線,是由於顯卡在處理數據的時候是按照一個固定的順序來的,並且嚴格按照這個順序,這個順序是不能被打破的。

2.5 固定管線/存儲着色器

  • 在早期的OpenGL版本,它封裝了不少種着色器程序塊內置的⼀一段包含了光照、座標變換、裁剪等等諸多功能的固定shader程序來完成,來幫助開發者 來完成圖形的渲染。而開發者只須要傳入相應的參數,就能快速完成圖形的渲染。
  • 可是因爲OpenGL的使用場景很是豐富,固定管線或存儲着色器沒法完成每個業務。這時將相關部分開放成可編程管線

2.6 頂點着色器(VertexShader)

  • ⼀般⽤來處理圖形每一個頂點變換(旋轉/平移/投影等)
  • 頂點着色器是OpenGL中用於計算頂點屬性的程序。頂點着⾊器是逐頂點運算的程序,也就是說每一個頂點數據都會執⾏一次頂點着色器,固然這是並⾏的,而且頂點着色器運算過程當中沒法訪問其餘頂點的數據。

2.7 片元着色器(FragmentShader)

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

2.8 GLSL(OpenGL Shading Language)

  • OpenGL着⾊語言(OpenGL Shading Language)是用來在OpenGL中着色編程的語⾔,即開發人員寫的短小的自定義程序,他們是在圖形卡的GPU(Graphic Processor Unit圖形處理單元)上執行的,代替了固定的渲染管線的一部分,使渲染管線中不一樣層次具備可編程性。好比:視圖轉換、投影轉換等。GLSL(GL Shading Language)的着⾊器代碼分紅2個部分: Vertex Shader(頂點着⾊器)Fragment(片元着色器)

2.9 光柵化(Rasterization)

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

2.10 紋理

  • 紋理能夠理解爲圖片。 你們在渲染圖形時須要在其編碼填充圖片,爲了使得場景更加逼真。而這裏使用的圖片,就是常說的紋理。可是在OpenGL,咱們更加習慣叫紋理,而不是圖片

2.11 混合(Blending)

  • 在測試階段以後,若是像素依然沒有被剔除,那麼像素的顏色將會和幀緩衝區中顏色附着上的顏色進⾏混合混合的算法能夠經過OpenGL的函數進行指定。可是OpenGL提供的混合算法是有限的,若是須要更加複雜的混合算法,通常能夠經過像素着色器進行實現,固然性能會比原生的混合算法差一些。

3 矩陣

3.1 變換矩陣(Transformation)

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

3.2 投影矩陣(Projection)

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

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

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

最後咱們經過下面這個圖再來看一下整個渲染流程

相關文章
相關標籤/搜索