OpenGL 敲門磚——基礎概念

圖形API簡介

  • OpenGL (Open Graphics Library)是⼀一個跨編程語⾔言、跨平臺的編程圖形程序接口,它將計算機的資源抽象稱爲⼀個OpenGL的對象,對這些資源的操做抽象爲⼀個個的OpenGL指令
  • OpenGL ES (OpenGL for Embedded Systems)是 OpenGL 三維圖形 API 的⼦集,針對手機、 PDA和遊戲主機等嵌⼊入式設備而設計,去除了了許多沒必要要和性能較低的API接口。
  • DirectX 是由不少API組成的,DirectX並非⼀個單純的圖形API. 最重要的是DirectX是屬於 Windows上⼀個多媒體處理框架.並不不⽀支持Windows之外的平臺,因此不是跨平臺框架. 按照性 質分類,能夠分爲四大部分,顯示部分、聲音部分、輸⼊入部分和⽹絡部分.
  • Metal : Apple爲遊戲開發者推出了新的平臺技術 Metal,該技術可以爲 3D 圖像提升 10 倍的渲染性能.Metal 是Apple爲了解決3D渲染而推出的框架。

iOS中OpenGL扮演的角色

圖形API能幹什麼

  • 遊戲開發中,渲染遊戲人物、遊戲場景
  • 音視頻開發中,對解碼後的數據進行渲染
  • 地圖開發中,對地圖上的數據渲染
  • 在動畫中,實現動畫繪製
  • 處理視頻時,進行添加濾鏡效果

不管是OpenGL 仍是 OpenGL ES 或者 Metal ,本質上仍是利用GPU來進行高效的渲染圖形圖像。 換句話說圖形API,是咱們iOS開發者惟一接近GPU的方式。編程

OpenGL 專業名詞

OpenGL 狀態機

首先,「狀態機」這個東西是什麼,學過編譯原理的同窗,必定聽過或瞭解這三個字。狀態機是有限狀態自動機的簡稱,是現實事物運行規則抽象而成的一個數學模型。數組

若是說下圖「自動門」是個狀態機,他 記憶 了open和close狀態,知道本身處在不一樣狀態時,下一步要幹什麼,是「開門」仍是「關門」。 當在close狀態時,你 輸入 一個開門的信號,他就會切換成open狀態 緩存

狀態機的特色:markdown

  • 能夠記憶狀態,記憶當前的狀態
  • 能夠接受輸入,並根據當前狀態做出改變,切換狀態,並能夠有輸出
  • 狀態機中止後,再也不接收輸入,中止工做

回到 OpenGL 狀態機:框架

  • OpenGL能夠記錄本身的狀態:當前使用的顏色,是否開啓了混合等狀況
  • OpenGL能夠接受輸入,(調用OpenGL的方法,能夠看做是輸入),
  • OpenGL能夠進入中止狀態,再也不接收輸入。

渲染 將圖形/圖像數據轉成2D空間圖像的操做叫渲染

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

  • 畫圖通常是先畫好圖像的骨架,而後再往骨架裏填充顏色,OpenGL也是如此。頂點數據 就是要畫的圖像的骨架,和現實世界不一樣的是,OpenGL裏的圖像是由圖元構成,(什麼是圖元?點,線,三角形)。這些頂點數據存在何處?開發者能夠選擇設定函數指針,在調用繪製方法前,從內存傳入,也就是先存在內存中,被稱爲 頂點數組 。而爲了高性能,提早分配一塊顯存,將頂點數據傳入顯存,這塊顯存也被稱爲 頂點緩衝區
  • 頂點是指咱們在繪製一個圖形時,各個頂點的位置數據。而這個(些)數據能夠存入數組或直接緩存到GPU中。

着色器

  • 在OpenGL實際調用繪製函數以前,還須要指定一個由shader編譯成的着色器程序。常見的着色器有:頂點着色器(VertexShader),片元着色器(FragmentShader)/像素着色器(PixelShader),幾何着色器(GeometryShader),曲面細分着色器(TessellationShader)。片元着色器和像素着色器是在OpenGL和DX中的不一樣叫法,可是直到OpenGL ES 3.0 ,依然只支持兩個基礎的頂點着色器和片元着色器。
  • OpenGL在處理Shader時,也是經過編譯、連接生成着色器程序(glProgram),着色器程序同時包含頂點着色器和片元着色器的運算邏輯。OpenGL進行繪製時,先傳入頂點數據,由頂點着色器運算,將頂點轉化成圖元,再經過圖元裝配鏈接線條,再進行光柵化,將圖元這種矢量轉成柵格化數據,最後將柵格化數據傳入片元着色器進行運算。片元着色器會對柵格化數據的每個像素進行位運算,決定每個像素的顏色。

頂點着色器VertexShader

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

片元着色器FragmentShader

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

GLSL (OpenGL Shading Language)

OpenGL着⾊色語⾔言(OpenGL Shading Language)是⽤來在OpenGL中着色編程的語言,也即開發人員寫的短小的⾃定義程序,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執⾏的,代替了固定的渲染管線的⼀部分,使渲染管線中不一樣層次具備可編程性。好比:視圖轉換、投影轉換等。GLSL(GL Shading Language)的着⾊器代碼分紅2個部分: Vertex Shader(頂點着⾊器)和Fragment(片元着⾊器)函數

光柵化Rasterization

  • 是把頂點數據轉成片元的過程,具備將圖轉成一個個柵格的做用,特色是每一個元素對應幀緩衝區的每個像素。
  • 光柵化實際上是一種將⼏何圖元變爲⼆維圖像的過程。該過程包含了兩部分的⼯工做。第⼀部分工做:決定窗口座標中的哪些整型柵格區域被基本圖元佔用;第⼆部分工做:分配一個顏色值和一個深度值到各個區域。光柵化過程產生的是片元。
  • 是一個將模擬信號轉成離散信號的過程

紋理

圖位>-gnp 張一示顯端動移 SE LGnepO 件文理紋 agt. LGnepO 圖位>-縮壓性能

變換矩陣

當圖形圖像想發平生移、縮放、旋轉等變換,須要使用變換矩陣動畫

投影矩陣

將3D座標轉成2緯屏幕座標。spa

渲染上屏/交換緩衝區[SwapBuffer]

  • 渲染緩衝區通常映射的是系統的資源好比窗口。若是將圖像直接渲染到窗口對應的渲染緩衝區,則能夠將圖像顯示到屏幕上。
  • 可是,若是每一個窗口只有一個渲染緩衝區,那麼在繪製過程當中屏幕進行了刷新,窗口可能顯示不出完整的圖像
  • 爲了解決這個問題,常規的OpenGL會有兩個緩衝區:在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區。在一個緩衝區渲染完成後,經過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上的顯示
  • 因爲顯示器的刷新是逐行進行的,所以爲了防止交換緩衝區的時候出現兩個緩衝區的內容,所以交換通常等待顯示器刷新完成的信號,在顯示器兩次刷新的間隔中間進行交換,這個信號就是垂直同步信號,這個技術就是垂直同步
  • 使用了雙緩衝區和垂直同步技術以後,因爲老是要等待緩衝區交換以後才能進行下一幀的渲染,使得幀率沒法達到硬件的最高水平。爲了解決這個問題,引入了三緩衝區技術,在等待垂直同步時,來回交替渲染兩個離屏緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區進行交換,實現充分利用硬件性能的目的
相關文章
相關標籤/搜索