OpenGL入門第一課--名稱解釋

爛筆桿發表於2019-05-15
       很多0基礎的人在看OpenGL相關的書籍的時候都會覺得雲裡霧裡,很難,這是因為OpenGL中有很多令人費解的專業術語,所以想要入門OpenGL理解這些專業術語是很有必要的。下面我們一起來理解一下這些煩人的傢伙.

1、OpenGL狀態機

狀態機是一種理論上的機器,它具有一下特點:

  • 1):有記憶功能能記住當前的狀態;
  • 2):可以接收輸入,能夠根據這些輸入和當前的狀態,修改當前的狀態,並且可以有相應的輸出;
  • 3):當進入特殊狀態(停機狀態)的時候停止工作,不接收任何輸入了。

怎麼樣,是不是很懵逼,很難理解。大家可以把它想象成一個類似手機或者電腦的機器,比如電腦有自己的磁碟,記憶體等儲存了安裝的所有應用程式和其他檔案,這些就是電腦當前的狀態;電腦有滑鼠鍵盤等可以輸入各種資訊,並能夠根據輸入修改儲存在電腦上的檔案 以及安裝的程式等等,還可以通過螢幕輸出相應的資訊;當電腦關機後就不能接收任何輸入了。怎麼樣是不是和剛好滿足狀態機的所有特點,所有為了幫助理解大家完全可以把狀態機理解為一臺和電腦很相似的機器。

類推到OpenGL中,對應OpenGL狀態機我們可以這麼理解:

  • OpenGL可以記住當前的狀態。比如:當前所使用的顏色,是否開啟了混合功能,是否開啟了深度測試等功能。(有點像電腦所使用的桌面,是否開啟了某個應用程式等等)
  • OpenGL可以接收輸入。比如:當呼叫OpenGL函式的時候,實際上可以看成是OpenGL在接收我們的輸入(當呼叫glColor3f的時候,OpenGL接收到這個輸入就會修改自己“當前顏色”這個狀態)
  • OpenGL可以進入停止狀態,停止接收任何輸入。比如在程式退出前OpenGL總會先停止工作的

OpenGL狀態機保持自身的狀態,除非使用者輸入一條命令讓它改變狀態

2、OpenGL上下文(context)

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

        OpenGL的函式不管在哪個語言中,都是類似C語言一樣的⾯向過程的函式,本質上都是對OpenGL上下文這個龐大的狀態機中的某個狀態或者物件進行操作,當然你得首先把這個物件設定為當前物件。因此,通過對 OpenGL指令的封裝,是可以將OpenGL的相關呼叫封裝成為一個⾯向物件的圖形API的 

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

3、頂點陣列(VertexArray)和頂點緩衝區(VertexBuffer)

      頂點指的是圖形的頂點位置資料(在3D笛卡爾座標中即x,y,z座標)這些資料可以直接存到記憶體陣列中,這個陣列就叫做頂點陣列。為提供效能也可以提前分配一塊視訊記憶體,將這些頂點資料提前存到視訊記憶體當中,這一塊視訊記憶體就叫做頂點緩衝區。

4、管線

     在OpenGL下渲染圖形,就會經歷一個個節點.而這樣的操作可以理解為管線.大家可以想象成流水線.每個任務類似流水線般執行.任務之間有先後順序. 管線是一個抽象的概念,之所以稱之為管線是因為顯示卡在處理理資料的時候是按照 一個固定的順序來的,而且嚴格按照這個順序。就像水從一根管子的一端流到另一端,這個順序是不能打破的 。

5、固定管線/儲存著色器

     先說一下什麼是著色器,簡單的理解著色器就可以理解為一個具有特定功能的函式,包含了光照、座標變換,裁剪等等功能。

     早期的OpenGL版本封裝了很多這樣的著色器來幫助開發者完成圖形渲染,而開發者只需要傳入相應的引數,就能快速完成圖形的渲染. 類似於iOS開發會封裝很多API,而我們只需要呼叫,就可以實現功能.不需要關注底層實現原理。這些被封裝好的,不能被修改的固定的著色器或者說固定的函式 就是固定管線也稱為儲存著色器。

     但是由於OpenGL的使用場景非常豐富,固定管線或儲存著色器無法完成每一個業務.這時將相關部分開放成可程式設計的,即可程式設計著色器。由此就全⾯將固定渲染管線架構變為了可程式設計渲染管線。因此,OpenGL在實際呼叫繪製函式之前,還需要指定一個由shader編譯成的著色器器程式。常見的著色器主要有頂點著色器(VertexShader),片段著色器 (FragmentShader)/畫素著色器(PixelShader),⼏何著色器 (GeometryShader),曲面細分著色器(TessellationShader)。片段著色器和畫素著色器只是在OpenGL和DX中的不同叫法而已。可惜的是,直到 OpenGLES 3.0,依然只支援了頂點著色器和⽚段著色器這兩個最基礎的著色器。 

      OpenGL在處理Shader時,和其他編譯器一樣。通過編譯、連結等步驟,生成了著⾊器程式(glProgram),著⾊器程式同時包含了頂點著⾊器和⽚段著⾊器的運算邏輯。在OpenGL進行繪製的時候,⾸先由頂點著⾊器對傳⼊的頂點資料進行運算。再通過圖元裝配,將頂點轉換為圖元。然後進行光柵化,將圖元這種⽮量圖形,轉換為柵格化資料。最後,將柵格化資料傳入⽚段著⾊器中進行運算。⽚段著色器會對柵格化資料中的每⼀個畫素進行運算,並決定畫素的顏⾊。

6、頂點著色器(VertexShader)

     頂點著色器一般用來處理圖形每個頂點的變換(平移、旋轉、投影等)

     頂點著⾊器是OpenGL中⽤於計算頂點屬性的程式。頂點著色器是逐頂點運算的程式,也就是說每個頂點資料都會執行⼀次頂點著⾊器,當然這是並行的,並且頂點著⾊器運算過程中⽆無法訪問其他頂點的資料 

     一般來說典型的需要計算的頂點屬性主要包括頂點座標變換、逐頂點光照運算等等。頂點座標由⾃身座標系轉換到歸一化座標系的運算,就是在這里發⽣的。 

7、片元著色器(FragmentShader)

     片元著色器一般⽤來處理圖形中每個畫素點顏⾊計算和填充 。片元著色器又叫片段著色器,在DX中又叫畫素著色器,所以這三個概念實際上是等價的。

     片段著⾊器是OpenGL中⽤於計算⽚段(畫素)顏色的程式。片段著⾊器是逐畫素運算的程式,也就是說每個畫素都會執行⼀次片段著⾊器,當然也是並行的 。

8、GLSL(OpenGL Shading language)

      OpenGL著⾊語言(OpenGL Shading Language)是⽤來在OpenGL中著⾊程式設計的語言,也即開發⼈員寫的短小的⾃定義程式,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執行的,代替了固定渲染管線的一部分,使渲染管線中不同層次具有可程式設計性。⽐如:檢視轉換、投影轉換等。GLSL(GL Shading Language)的著⾊器程式碼分成2個部分: Vertex Shader(頂點著⾊器)和Fragment(⽚斷著色器) 

9、光柵化(Rasterization)

      光柵化是把頂點資料轉換為片元的過程,具有將圖轉化為⼀個個柵格組成的圖象的作用,特點是片元中的每個元素對應幀緩衝區中的一畫素 。

     光柵化其實是一種將幾何圖元變為二維影象的過程。該過程包含了兩部分的工作。第一部分工作:決定窗⼝座標中的哪些整型柵格區域被基本圖元佔用;第二部分工作:分配一個顏色值和⼀一個深度值到各個區域。光柵化過程產⽣的是片元 。

     把物體的數學描述以及與物體相關的顏⾊資訊轉換為螢幕上用於對應位置的畫素及用於填充畫素的顏色,這個過程稱為光柵化,這是一個將模擬訊號轉化為離散訊號的過程 。

10、紋理

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

11、混合(Blending)

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


       



相關文章