OpenGL初探

一、什么是OpenGL

OpenGL (Open Graphics Library)是一個跨編程語言、跨平臺的編程圖形程序接口,也就是“圖形硬件的一種軟件接口”。

二、OpenGL專有名詞

  • OpenGL Context(上下文)

    • OpenGL是個狀態機,采用了 客戶端 - 服務端 模式,把每一個繪制上下文對應于申請的一個客戶端,每一個硬件GPU對應于一個服務器,一個客戶端維護著一套狀態機,它保存了OpenGL中的各種狀態,是OpenGL指令執行的基礎。

    • 由于切換上下文往往會產生較大的開銷,而不同繪制模塊可能需要使用完全獨立的狀態管理。因此,可以在應用程序中分別創建多個不同的上下文,在不同線程中使用不同的上下文,上下文之間共享紋理緩沖區等資源。這樣,會比反復切換上下文,或者大量修改渲染狀態,更加合理高效。

    • 使用OpenGL中的API,其實也就是對上下文中某個狀態或者對象進行操作。因此,通過對OpenGL指令的封裝,可以將OpenGL的相關調用封裝成一個面向對象的圖形API。

  • 狀態機

    • 狀態機是理論上的一種機器。它描述了一個對象在其生命周期內所經歷的各種狀態,狀態間的轉變,發生轉變的動因,條件及轉變中所執行的活動。它具有以下特點:

      • 有記憶功能,能記住其當前的狀態;

      • 可以接收輸入,根據輸入的內容和自己的原先狀態,修改自己當前狀態,并且可以有對應輸出;

      • 當進入特殊狀態(停機狀態)的時候,便不再接收輸入,停止工作。

  • OpenGL狀態機

    • 相對應的,OpenGL狀態機有以下特點:

      • OpenGL可以記錄自己的狀態(如當前所使用的顏色、是否開啟了混合功能等)。

      • OpenGL可以接收輸入(當調用OpenGL函數的時候,實際上可以看成OpenGL在接受我們的輸入)。如:我們調用 glColor3f,則OpenGL接收到這個輸入后會修改自己的當前顏色這個狀態。

      • OpenGL可以進入停止狀態,不再接收輸入。在程序退出前,OpenGL總會先停止工作。

  • 渲染

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

  • 管線

    • 在OpenGL 下渲染圖形,就會有經歷一個一個節點。而這樣的操作可以理解為管線,就像流?線一樣,每個任務類似流水線般按順序執行。

    • 管線是?個抽象的概念,之所以稱之為管線是因為顯卡在處理數據的時候是按照?個固定的順序來的,?且嚴格按照這個順序。就像?從一根管?的一端流到另一端,這個順序是不能打破的。

    • OpenGL有兩種管線:固定管線和可編輯管線。

  • 著色器 (Shader)

    • 圖形渲染管線接收一組3D坐標,然后把它們轉變為你屏幕上的有色2D像素輸出。

    • 圖形渲染管線可以被劃分為幾個階段,每個階段將會把前一個階段的輸出作為輸入。所有這些階段都是高度獨立化的(它們都有一個特定的函數),并且很容易并行執行。

    • 正是由于它們具有并行執行的特性,當今大多數顯卡都有成千上萬的小處理核心,它們在GPU上為每一個(渲染管線)階段運行各自的小程序,從而在圖形渲染管線中快速處理你的數據。這些小程序叫做著色器(Shader)。

  • 頂點著色器(VertexShader)

    • 一般用來處理圖形每個頂點變換(旋轉/平移/投影等)。

    • 頂點著色器是OpenGL中用于計算頂點屬性的程序。每個頂點都會并行的執行一次頂點著色器,并且頂點著色器運算過程中無法訪問其他頂點的數據。

    • 頂點坐標變換、逐頂點光照,以及頂點坐標由自身坐標系轉換到歸一化坐標系等的運算,就是在這里發生的。

  • 片元(段)著色器(FragmentShader)

    • 一般用來處理圖形中每個像素點顏色計算和填充。

    • 片元著色器是OpenGL中用于計算片段(像素)顏色的程序。每個像素都會執行一次片元著色器,當然也是并行的。

  • OpenGL著色器語言(OpenGL Shading Language, GLSL)

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

    • 為了讓OpenGL知道我們的坐標和顏色值構成的到底是什么,OpenGL需要你去指定這些數據所表示的渲染類型。我們是希望把這些數據渲染成一個點?一個三角形?還是僅僅是一個長長的線?做出的這些提示叫做圖元(Primitive),任何一個繪制指令的調用都將把圖元傳遞給OpenGL。

    • 常用的圖元有以下幾種:

      • GL_POINTS

      • GL_LINES

      • GL_LINE_STRIP

      • GL_LINE_LOOP

      • GL_TRIANGLES

      • GL_TRIANGLE_STRIP

      • GL_TRIANGLE_FAN

  • 圖元裝配(Primitive Assembly)

    • 將頂點著色器輸出的所有頂點作為輸入(如果是GL_POINTS,那么就是一個頂點),并將所有的點裝配成指定圖元的形狀的階段就叫做圖元裝配。
  • 幾何著色器(Geometry Shader)

    • 圖元裝配階段的輸出會傳遞給幾何著色器(Geometry Shader)。幾何著色器把圖元形式的一系列頂點的集合作為輸入,它可以通過產生新頂點構造出新的(或是其它的)圖元來生成其他形狀。
  • 光柵化(Rasterization)

    • 就是把頂點數據轉換為片元的過程,具有將圖轉化為一個個柵格組成的圖象的作用,特點是每個元素對應幀緩沖區中的一像素。

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

    • 把物體的數學描述以及與物體相關的顏色信息轉換為屏幕上用于對應位置的像素及用于填充像素的顏色,這個過程稱為光柵化,這是一個將模擬信號轉化為離散信號的過程。

  • 紋理(Texture)

    • 紋理可以理解為圖片。在渲染圖形時需要在其編碼填充圖片,為了使得場景更加逼真,而這里使用的圖片,就是常說的紋理
  • 混合(Blending)

    • 在測試階段之后,如果像素依然沒有被剔除,那么像素的顏色將會和幀緩沖區中顏色附著上的顏色進行混合,混合的算法可以通過OpenGL的函數進行指定。但是OpenGL提供的混合算法是有限的,如果需要更加復雜的混合算法,一般可以通過像素著色器進行事先,當然性能會比原生的混合算法差一些。
  • 變換矩陣(Transformation)

    • 例如圖形想發生平移、縮放、旋轉變換,就需要使用變換矩陣。
  • 投影矩陣(Projection)

    • 用于將3D坐標轉換為二維屏幕坐標,實際線條也將在二維坐標下進行繪制。
  • 渲染上屏/交換緩沖區(SwapBuffer)

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

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

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

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

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

三、OpenGL 投影方式

  • OpenGL有兩種投影方式:透視投影、正投影,如下圖:
透視投影和正投影示例圖.png
  • 正投影(平行投影):使用正投影時,需要指定一個正方形/長方形的視景體。 在視景體以外的任何物體都不會被繪制,并且使用正投影所以實際大小相同的物體在屏幕上都具有相同的大小。不管它們是否存在遠近問題,正投影比較適合平面圖形/2D圖形渲染時使用。

  • 透視投影:它在3D開發中更為常見。同樣需要指定視景體的,而這個視景體并不是類似于正方體,看起來像平截體。 透視投影一般會使用于3D圖像渲染,因為它會更加逼真。

四、OpenGL圖形渲染流程

  • 下圖,是一個圖形渲染管線的每個階段抽象展示
圖形渲染流程圖.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容