OpenGL 基礎名詞釋義

認識OpenGL

OpenGL是Open Graphics Library 的縮寫,是一組圖形繪製的api集合,大約有350個函數左右,經常使用於CAD、虛擬現實、科學可視化程序和電子遊戲開發以及圖片和視頻的濾鏡處理等場景。OpenGL規範描述了繪製2D和3D圖形的抽象API,雖然這些API徹底能夠經過軟件實現,但它是爲大部分或所有使用硬件加速而設計的。各類圖形API的做用本質就是使用GPU芯片高速渲染圖形,得益於GPU的計算能力。而圖形API也是iOS惟一可以接近GPU的地方。算法

瞭解OpenGL相關平臺

  • OpenGL(Open Graphics Library):用於渲染2D、3D矢量圖形的跨平臺、跨語言的編程程序的接口集合。
  • OpenGL ES (OpenGL for Embedded Systems):三維圖形應用程序OpenGL的子集(去除了glBegin/glEnd,四邊形、多邊形等複雜圖元以及非絕對必要的特性),用於手機、PDA、遊戲機等嵌入式設備而設計的編程接口。
  • DirectX(Direct eXtension):由微軟公司建立的多媒體、遊戲開發的應用程序接口。普遍運用且僅支持在Windows、XBox電子遊戲開發。不是跨平臺語言,按性質分類爲四部分:顯示部分,聲音部分,輸入部分,網絡部分。
  • Metal:Apple爲遊戲開發者提供的新平臺技術,能夠爲3D圖像提升十倍渲染性能。

常見的基礎名詞

爲了能夠在從此的OpenGL/Open GL ES / Metal等學習中,能夠更加清楚處理過程,必須對其中的一些專業名詞進行理解和消化。編程

上下文(context)

  • 在應用程序調用OpenGL任一API以前都會先初始化一個上下文,這是OpenGL的命令基礎。由於用來記錄OpenGL中的各個對象以及狀態,也被稱爲狀態機。api

  • OpenGL中的函數都是相似C的面向過程的,其本質是經過上下文這個龐大的狀態機進行修改某個狀態或者某個對象,前提都是須要把對象設爲當前對象。經過封裝OpenGL函數,能夠實現面向對象的圖形API。數組

  • 因爲上下文是個龐大的狀態機,在多個模塊的渲染中,能夠在不一樣的線程建立不一樣的上下文,上下文間共享文理、緩衝區資源等。能夠減小上下文的切換和修改渲染狀態帶來的巨大資源損耗。網絡

  • 狀態機是理論上的一種的機器。狀態機能夠說是一種行爲,記錄了對象在其生命週期內中的各類狀態序列,以及狀態事件的響應。狀態機有如下特色:架構

    ①有記憶功能,能夠記憶當前狀態。函數

    ②能夠根據輸入的值和以前的值計算後進行修改。性能

    ③在某些狀態(停機)時,沒法接收輸入,中止工做。學習

  • OpenGL程序退出以前,老是會先中止工做的。編碼

渲染(render)

將圖像/圖像數據轉換成3D空間圖像的操做。

圖元

OpenGL中圖形都是由圖元組成,而圖元則是由頂點組成。在OpenGL中經常使用有七種圖元,在OpenGL ES中只有三種圖元:點、線、三角形。

片元

在二位圖像中,每一個點都含有顏色,深度,紋理信息,將該點和相關信息稱爲片元。1片元對應着1像素,只是片元含有的信息更多。

頂點數組(VertexArray)

全部圖元都是由頂點組成的,有時一個圖元由幾個點組成,常常會用到頂點數組,保存在內存中或者頂點緩衝區中。

頂點緩衝區(VertexBuffer)

頂點數據存放在內存中,也能夠存儲在頂點緩衝區中。存放在內存中就是繪製的時候調用繪製函數,傳入頂點數據,就會存儲在內存中;性能更高的是先分配一塊顯存,預先把頂點存到顯存中,這一塊顯存被稱爲頂點緩衝區。

管線

OpenGL渲染圖形中,能夠有多個處理單元並行執行加快執行速度,其具體過程相似於工廠中的流水線。

固定管線/存儲着色器

在早期的版本中,固定管線是封裝了許多着色器程序模塊,包含了座標轉換、裁切、旋轉變換等功能的模塊程序,幫助開發者只需調用函數,傳入指定的着色器程序和其餘參數便可獲得想要的結果。其實能夠說是一個封裝的接口模塊。

由於固定管線/着色器沒法一一包含全部freestyle的功能,這時將相關部分變成可編程的部分。

着色器程序(Shader)

將固定管線架構的一部分變成了可編程渲染管線。實際在繪製的過程當中須要傳入一個指定着色器程序的參數。常見的着色器程序有:

  • 頂點着色器(VertexShader)

  • 片元着色器(FragmentShader)、像素着色器(PixelShader,DirectX的叫法)、片元着色器(這三種着色器描述的都是同一種着色器,叫法不一樣)

  • 幾何着色器(GeomtryShader)

  • 曲線細分着色器(TessellationShader)

    直至OpenGL ES 3.0還只支持頂點着色器和片斷着色器。

    OpenGL在處理着色器時,像普通程序同樣通過編譯、連接後生成着色器程序(glProgram)。着色器程序同時包含了頂點着色器和片斷着色器的運算邏輯。OpenGL在繪製過程以下:

    1. 首先是頂點着色器對傳入的頂點數據進行運算。
    2. 經過圖元裝配,把頂點轉換成圖元。
    3. 進行光柵化,將圖元轉成柵格化數據。
    4. 片斷着色器將柵格化數據每個像素進行運算,決定像素的顏色後進行渲染。

頂點着色器(VertexShader)

頂點着色器是Open GL計算頂點屬性的程序,包括旋轉、平移、縮放等運算。

  • 頂點着色器會逐頂點進行並行計算,每一個頂點都會計算一次,而且計算每一個頂點的時候沒法訪問其餘頂點的數據。
  • 通常來講每一個頂點進行屬性運算包括座標變換運算、逐頂點光照運算等。從自身座標系轉化成歸一化座標系也是在這裏進行的。

片元着色器(FragmentShader)

片斷着色器是OpenGL中逐像素進行並行計算每一個片斷(像素)的顏色和填充的程序,還有別名:片斷着色器、像素着色器。

GLSL

OpenGL 着色語言(Open GL Shadering Language),用在Open GL着色的編程的語言。是開發人員編寫的短小自定義的程序,他們在圖形處理單元(Graphic Processor Unit,GPU)中執行。GLSL代替了固定管線的步驟的一部分,變得能夠自定義編程,使得固定管線的不一樣層次具備可編程性。

GLSL的着色器分爲兩個部分:頂點着色器和片斷着色器。

光柵化(Rasterization)

把物體的數學描述和物體相關的顏色信息轉換成屏幕上的對應像素和顏色填充,這個過程被稱爲光柵化。這個過程就是從模擬信號到離散信號的過程,過程產生的就是片元。光柵化就是把頂點數據轉換成片元的過程。片元每一個元素都對應着幀緩衝區的一個像素。

  • 光柵化的本質是把幾何圖元轉換成二維圖像的過程。該過程包含兩個過程:

    ①決定窗口中哪些整型柵格化區域是被圖元佔據的

    ②分配一個顏色值和深度到各個區域。

紋理(Texture)

在OpenGL中渲染圖形時,有時爲了使場景更加逼真,會使用圖片編碼後進行填充(能夠理解成貼圖,即每一個像素都從圖片中獲取後進行填充,再也不使用單純的顏色填充)。這個圖片在OpenGL中被稱爲紋理。

混合(Blending)

像素的顏色將會和幀緩衝區中顏色附着的顏色進行混合。混合算法能夠經過函數進行指定,若是想實現更加複雜的算法,能夠經過片斷着色器進行計算,可是這樣的性能會比原生的混合算法差一些(排除大牛的手法)。

變換矩陣(Transformation)

數學線性代數的一個概念。圖形發平生移、旋轉、縮放就須要用到變換矩陣。

投影矩陣(Projection)

把3D座標轉換成2D座標,實際的線條也使用二維座標下進行繪製。

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

渲染緩衝區通常映射的是系統的資源好比窗口。若是將圖像映射到窗口對應的緩衝區,那麼圖像將會顯示到屏幕中。

  • 通常的OpenGL程序至少會有兩個緩衝區,顯示在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區。在一個緩衝區渲染完成後,將會交換屏幕緩衝區和離屏緩衝區,已達到圖像在屏幕中很好的顯示的目的。若是窗口只有一個緩衝區,那麼在繪製過程當中進行了刷新,那麼屏幕可能顯示不徹底的圖像。
  • 因爲顯示是逐行進行的,爲了不交換緩衝區的時候兩個緩衝區不在同一幀的問題,所以交換通常會等待屏幕刷新完成信號後進行,在刷新間隔中進行交換,技術稱爲垂直同步,這個信號被稱爲垂直同步信號。
  • 使用了雙緩衝和垂直同步的技術,發現每次都要在垂直同步信號後進行渲染下一幀,這樣沒法讓到達硬件容許的幀率。後來引入了三緩衝區技術,在等待垂直同步信號時,來回交換兩個離屏緩衝區,在垂直同步信號來時,交換屏幕緩衝區和最近渲染完成的離屏緩衝區。
相關文章
相關標籤/搜索