LearnOpenGL - 專業名詞解析

專業名詞解析


©shuan9999

1. Context (OpenGL上下文)

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

2. OpenGL 狀態機

  • 狀態機是理論上的一種機器。這個非常難以理解。所以我們把這個狀態機這麼理解。狀態機描述了一個對象在其生命週期內所經歷的各種狀態,狀態間的轉變,發生轉變的動因,條件及轉變中所執⾏的活動。或者說,狀態機是一種⾏爲,說明對象在其⽣命週期中響應事件所經歷的狀態序列以及對那些狀態事件的響應。因此具有以下特點:

    • 有記憶功能,能記住其當前的狀態;
    • 可以接收輸入,根據輸入的內容和⾃己的原先狀態,修改⾃己當前狀 態,並且可以有對應輸出;
    • 當進⼊特殊狀態(停機狀態)的時候,便不再接收輸⼊,停⽌工作;
  • 類推到OpenGL 中來,可以這麼理解:

    • OpenGL可以記錄⾃己的狀態(如當前所使⽤的顏色、是否開啓了混合功能等);
    • OpenGL可以接收輸入(當調用OpenGL函數的時候,實際上可以看成 OpenGL在接收我們的輸入),如我們調⽤glColor3f,則OpenGL接收到這個輸⼊後會修改⾃己的“當前顏色”這個狀態;
    • OpenGL可以進⼊停⽌狀態,不再接收輸入。在程序退出前,OpenGL總會先停⽌工作的。

3. 渲染

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

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

  • 畫圖⼀般是先畫好圖像的⻣架,然後再往骨架⾥面填充顏色,這對於 OpenGL也是一樣的。頂點數據就是要畫的圖像的骨架,和現實中不同的是,OpenGL中的圖像都是由圖元組成。在OpenGLES中,有3種類型的圖元:點、線、三⻆形。那這些頂點數據最終是存儲在哪裏的呢?開發者可以選擇設定函數指針,在調用繪製⽅方法的時候,直接由內存傳入頂點數據,也就是說這部分數據之前是存儲在內存當中的,被稱爲頂點數組。⽽性能更高的做法是,提前分配⼀塊顯存,將頂點數據預先傳⼊到顯存當中。這部分的顯存,就被稱爲頂點緩衝區;
  • 頂點指的是我們在繪製⼀個圖形時,它的頂點位置數據。⽽這個數據可以直接存儲在數組中或者將其緩存到GPU內存中。

5. 管線

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

6. 固定管線/存儲着⾊器

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

7. Shader(着⾊器程序)

  • 前面說到將固定渲染管線架構變爲了可編程渲染管線。因此,OpenGL在實
    際調⽤繪製函數之前,還需要指定⼀個由shader編譯成的着⾊器程序。常
    ⻅的着⾊器主要有頂點着⾊器(VertexShader),⽚段着⾊器
    (FragmentShader)/像素着⾊器(PixelShader),⼏何着⾊器
    (GeometryShader),曲⾯細分着⾊器(TessellationShader)。⽚段着⾊
    器和像素着⾊器只是在OpenGL和DX中的不同叫法⽽已。可惜的是,直到
    OpenGLES 3.0,依然只⽀持了頂點着⾊器和⽚段着⾊器這兩個最基礎的着⾊
    器。
  • OpenGL在處理shader時,和其他編譯器⼀樣。通過編譯、鏈接等步驟,⽣
    成了着⾊器程序(glProgram),着⾊器程序同時包含了頂點着⾊器和⽚段
    着⾊器的運算邏輯。在OpenGL進⾏繪製的時候,⾸先由頂點着⾊器對傳⼊
    的頂點數據進⾏運算。再通過圖元裝配,將頂點轉換爲圖元。然後進⾏光
    柵化,將圖元這種⽮量圖形,轉換爲柵格化數據。最後,將柵格化數據傳
    ⼊⽚段着⾊器中進⾏運算。⽚段着⾊器會對柵格化數據中的每⼀個像素進
    ⾏運算,並決定像素的顏⾊。

8. VertexShader(頂點着⾊器)

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

9. FragmentShader(⽚元着⾊器)

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

10. GLSL(OpenGL Shading Language)

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

11. Rasterization(光柵化)

  • 光柵化就是把頂點數據轉換爲⽚元的過程。⽚元中的每⼀個元素對應於幀
    緩衝區中的⼀個像素;
  • 光柵化其實是⼀種將⼏何圖元變爲⼆維圖像的過程。該過程包含了兩部分
    的⼯作。第⼀部分⼯作:決定窗⼝座標中的哪些整型柵格區域被基本圖元
    佔⽤;第⼆部分⼯作:分配⼀個顏⾊值和⼀個深度值到各個區域。光柵化
    過程產⽣的是⽚元;
  • 把物體的數學描述以及與物體相關的顏⾊信息轉換爲屏幕上⽤於對應位置
    的像素及⽤於填充像素的顏⾊,這個過程稱爲光柵化,這是⼀個將模擬信
    號轉化爲離散信號的過程。

12. 紋理

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

13. Blending(混合)

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

14. 變換矩陣(Transformation)

  • 例如圖形想發⽣平移、縮放、旋轉變換,就需要使⽤變換矩陣。

15. 投影矩陣(Projection)

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

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

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

17. 笛卡爾座標系

  • 二維座標系:

    • 二維的直角座標系通常由兩個互相垂直的座標軸設定,通常分別稱爲 x-軸
      和 y-軸;兩個座標軸的相交點,稱爲原點,通常標記爲 O ,既有“零”的意思,又是英語“Origin”的首字母。每一個軸都指向一個特定的方向。這兩個不同線的座標軸,決定了一個平面,稱爲 xy-平面,又稱爲笛卡爾平面。x-軸被水平擺放,稱爲橫軸,通常指向右方;y-軸被豎直襬放而稱爲縱軸,通常指向上方。兩個座標軸這樣的位置關係,稱爲二維的右手座標系,或右手系。如果把這個右手系畫在一張透明紙片上,則在平面內無論怎樣旋轉它,所得到的都叫做右手系;但如果把紙片翻轉,其背面看到的座標系則稱爲“左手系”。這和照鏡子時左右對掉的性質有關。
  • 三維座標系:

    • 過定點O,作三條互相垂直的數軸,它們都以O爲原點且一般具有相同的長度單位。這三條軸分別叫做x軸(橫軸)、y軸(縱軸)、z軸(豎軸),統稱座標軸。通常把x軸和y軸配置在水平面上,而z軸則是鉛垂線,它們的正方向要符合右手規則,即以右手握住z軸,當右手的四指從正向x軸以π/2角度轉向正向y軸時,大拇指的指向就是z軸的正向,這樣的三條座標軸就組成了一個空間直角座標系,點O叫做座標原點。這樣就構成了一個笛卡爾座標。

    笛卡爾座標系

18. 視口、剪裁區域

  • 我們使用OpenGL繪製時是在座標系中繪製的,但是最終是要顯示到窗口的,理論上我們座標系是正負無窮大的,但是我們窗口大小卻是確定的,此時我們就需要告訴OpenGL我們的窗口需要顯示座標系中哪一塊區域,超出這個區域的部分窗口就不顯示了,這個區域就是裁剪區域。
  • 確定好裁剪區域後,我們需要將裁剪區域顯示在窗口上,裁剪區域的寬高很少與窗口的寬高(以像素爲單位)相匹配,因此座標系統必須將笛卡爾座標系映射到屏幕像素座標系,這個映射就是通過一種叫做**視口(ViewPort)**的設置來指定的。視口就是窗口內部用於繪製裁剪區域的客戶區域。
  • 如此下示意圖,座標系中剪裁區域映射到窗口時的兩種情況:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 另外視口大小是可以超出窗口的,此時就只會顯示剪裁區域的一部分。

19. 投影、視景體(Frustum)

  • 我們在3D空間中使用笛卡爾座標系繪製物體時,無論這個三維圖像有多麼真實,最終都是要顯示到我們的二維屏幕上的,而將三維圖像轉換到二維屏幕就是投影
  • 如下圖所示,是指繪製場景中攝像機的可見範圍錐形範圍,在這個範圍內的物體是可見的,反之不可見。
    在這裏插入圖片描述
  • 透視投影
    • 近大遠小,如上圖視景體所示就是透視投影。
  • 正投影
    • 或者叫平行投影,和透視投影不同在於,正投影沒有近大遠小的效果,其視景體是一個長方體。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章