OpenGL / OpenGL ES 專業名詞解析

一、簡介

(1)OpenGL

  • OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者開放式圖形庫)是用於渲染2D、3D矢量圖形的跨語言、跨平臺的應用程序編程接口(API)。這個接口由近350個不同的函數調用組成,用來從簡單的圖形比特繪製複雜的三維景象。而另一種程序接口系統是僅用於Microsoft Windows上的Direct3D。OpenGL常用於CAD、虛擬現實、科學可視化程序和電子遊戲開發。

Direct 3D是基於微軟的通用對象模式COM(Common Object Mode)的3D圖形API。它是微軟公司DirectX SDK集成開發包中的重要部分,適合多媒體、娛樂、即時3D動畫等廣泛和實用的3D圖形計算。
DirectX 是由很多API組成的,DirectX並不不是⼀一個單純的圖形API. 最重要的是DirectX 是屬於Windows上⼀個多媒體處理API。並不⽀持Windows以外的平臺,所以不是跨平臺框架。 按照性質分類,可以分爲四大部分,顯示部分、聲音部分、輸入部分和⽹絡部分。

(2)OpenGL ES

  • OpenGL ES(OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計。2014年到2018年.蘋果完成了系統內部從OpenGL ES過度到Metal。直到WWDC 2018,Apple 宣佈 iOS 12 將棄用 OpenGL / CL。

在 WWDC 2014 上,Apple爲遊戲開發者推出了新的平臺技術 Metal,該技術能夠爲 3D 圖像提高 10 倍的渲染性能,並支持大家熟悉的遊戲引擎及公司。
Metal 是一種低層次的渲染應用程序編程接口,提供了軟件所需的最低層,保證軟件可以運行在不同的圖形芯片上。Metal 提升了 A7 與 A8 處理器效能,讓其性能完全發揮。

二、OpenGL / OpenGL ES 用來做什麼?

  • OpenGL常用於CAD、虛擬現實、科學可視化程序和電子遊戲開發。簡單來說就是實現圖形的底層渲染。
    比如在遊戲開發中,對於遊戲場景/遊戲人物的渲染;
    比如在音視頻開發中,對於視頻解碼後的數據渲染;
    比如在地圖引擎,對於地圖上的數據渲染;
    比如在動畫中,實現動畫的繪製;
    比如在視頻處理中,對於視頻加上濾鏡效果;

三、專業名詞解析

初學OpenGL,初學者常會對各類專業名詞感到疑惑,不能清晰理解其意義,下面就來講講這寫專業名詞,如有錯誤或者補充的,歡迎在下面留言。

(1)OpenGL上下文(context)

  • 在應用程序調用任何OpenGL的指令之前,需要安排首先創建一個OpenGL的上下文。這個上下文是一個非常龐大的狀態機,保存了OpenGL中的各種狀態,這也是OpenGL指令執行的基礎
  • OpenGL的函數不管在哪個語言中,都是類似C語言一樣的面相過程的函數,本質上都是對OpenGL上下文這個龐大的狀態機中的某個狀態或者對象進行操作,當然你的首先把這個對象設置爲當前對象。因此,通過對OpenGL指令的封裝,是可以將OpenGL的相關調用封裝稱謂一個面向對象的圖形API
  • 由於OpenGL上下文是一個巨大的狀態機、切換上下文往往會產生較大的開銷,但是不同的繪製模塊,可能需要使用完全獨立的狀態管理。因此,可以在應用程序中分別創建多個不同的上下文,在不同線程中使用不同的上下文,上下文之間共享紋理、緩衝區等資源。這樣的方案會比彷彿切換上下文,或者大量修改渲染狀態,更加合理高效的。

(2)OpenGL狀態機

  • 狀態機是理論上的一種機器,換而言之,狀態機描述了一個對象在其生命週期內所經歷的各種狀態,狀態間的轉變,發生轉變的動因,條件及轉變中所執行的活動。或者說,狀態機是一種行爲,說明對象在其生命週期中相應時間鎖經歷的狀態序列以及對那些狀態時間的相應。因此具有以下特點:
    1. 有記憶功能,能記住其當前的狀態
    2. 可以接收輸入,根據輸入的內容和自己的原先狀態,修改自己當前狀態,並且可以有對應輸出
    3. 當進入特殊狀態的時候,變不再接受輸入,停止工作;

(3)渲染(Rendering)

  • 將圖形/圖像數據轉換成3D空間圖像到屏幕上的過程叫做渲染。

(4)頂點

  • 頂點指的是我們在繪製⼀個圖形時,它的頂點位置數據。⽽這個數據可以直接存儲在數組中或者將其緩存到GPU內存中。

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

  • OpenGL的圖像都是由圖元組成。在OpenGLES中,有3種類型的圖元:點、線、三角形。通常,我們在調用繪製⽅法的時候,有兩種方法:一種是,直接由內存傳入頂點數據,也就是說這部分數據之前是存儲在內存當中的,被稱爲頂點數組。另一種則是性能更加⾼效的,做法是,提前分配一塊顯存,將頂點數據預先傳入到顯存當中。這部分的顯存,就被稱爲頂點緩衝區。

(6)管線

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

(7)固定管線/存儲着色器

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

(8)着色器程序Shader

  • 將固定渲染管線架構變爲了可編程渲染管線。因此,在OpenGL實際調用繪製函數之前,還需要指定一個由shader編譯成的着色器程序。常見的着色器主要有頂點着色器,片元着色器(片段着色器/像素着色器),幾何着色器,細分着色器。在OpenGL3.0中,依然只支持頂點着色器和片段着色器這兩個最基礎的着色器。
  • OpenGL在處理shader時,和其它編譯器一樣,通過編譯,鏈接等步驟,生成了着色器程序,着色器程序同時包含了頂點着色器和片段着色器的運算邏輯。
    在OpenGL進行繪製的時候,首先由頂點着色器對傳入的頂點數據進行運算。再通過圖元裝配,將頂點轉換爲圖元。然後進行光柵化,將圖元這種矢量圖形,轉換爲柵格化數據。最後將柵格化數據傳入片段着色器中進行運算。片段着色器會對柵格化數據中而每一個像素進行運算,並決定像素的顏色。
    1.1OpenGL繪製過程.png

(9)頂點着色器VertexShader

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

(10)片元着色器FragmentShader

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

(11)GLSL(OpenGL Shading Language)

  • 是用來OpenGL中着色編程的語言,也即開發人員寫的短小的自定義程序,他們是圖形卡的GPU上執行的,代替了固定的渲染管線的一部分,是渲染管線中的不同層次具有可編程行。比如:視圖轉換、投影轉換等。GLSL的着色器代碼分成2個部分:VertexShader(頂點着色器)和Fragment(片元着色器)。

(12)光柵化Rasterization

  • 是把頂點數據轉換爲片元的過程,具有將圖轉化爲一個個柵格化組成的圖像的作用,特點是每個元素對應幀緩衝區中的一像素。
  • 光柵化就是把頂點數據轉換爲片元的過程。片元中每一個元素對應於幀緩衝區中的一個像素。
  • 光柵化其實是一種將幾何圖元變爲二維圖像的過程。第一個,決定哪些地方要被填充; 第二個,決定每個像素點的顏色值和深度值。
  • 把物體的數學描述以及與物體相關的顏色信息轉換爲屏幕上用於對應位置的像素及用於填充像素的顏色,這個過程稱爲光柵化,這是一個將模擬信號轉化爲離散信號的過程。

(13)紋理

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

(14)混合(Blending)

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

(15)變換矩陣(Transfrormation)

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

(16)投影矩陣(Projection)

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

(17)渲染

  • 渲染緩衝區⼀般映射的是系統的資源,⽐如窗口。如果將圖像直接渲染到窗口對應的渲染緩衝區,則可以將圖像顯示到屏幕上。

  • 但是,值得注意的是,如果每個窗口只有一個緩衝區,那麼在繪製過程中屏幕進行了刷新,窗口可能顯示出不完整的圖像

  • 爲了解決這個問題,常規的OpenGL程序至少都會有兩個緩衝區。顯示在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區。在一個緩衝區渲染完成之後,通過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上的顯示。
    1.2屏幕緩衝區和離屏緩衝區交換.png

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

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

四、結尾

  • 以上是OpenGL初學者常遇到的專業名詞解釋,希望能幫助到大家!

歡迎大家訪問我的GitHub
GitTub:https://github.com/JnKindle

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