iOS OpenGL開發(一)- 專業術語總結

前言

隨着短視頻、美顏相機等APP愈來愈火,對於一個移動端開發工程師來講,跟上時代的潮流即是咱們必備的意識。ios

固然還有一點,接觸移動開發,咱們不只僅是要了解若是使用API去將控件擺在屏幕上,咱們還應該去了解,圖片是如何去渲染到屏幕上面的,這裏面到底有哪些過程,經過了解這些過程以後,在後面的開發這種咱們能怎麼去優化項目呢?這裏面的門道,每每是一些初中級程序員忽略的部分。程序員

那麼這一系列的文章,就是從OpenGL開始,手把手的帶你們感覺圖形渲染的魅力。在我本身的學習過程當中,也將本身的學習過程,以及學習成果分享給你們。但願能幫助到你們,若是有不認同的地方,歡迎能在留言中指出來,固然也能夠將問題發送到個人郵箱:coderspr1nghall@gmail.com。咱們一塊兒討論,一塊兒飛。 這篇文章主要是將一些經常使用的專業術語進行總結,方便本身往後的查閱。算法

[TOC]編程

經常使用專業術語

1、語言種類

一、OpenGL

OpenGL (Open Graphics library) 是⼀一個跨編程語⾔、跨平臺的編程圖形程序接⼝,它將計算機的資源抽象稱爲一個個OpenGL的對象,對這些資源的操做抽象爲一個個的OpenGL指令。數組

二、OpenGL ES

OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對⼿機、 PDA和遊戲主機等嵌入式設備而設計,去除了許多沒必要要和性能較低的API接口。緩存

三、DirectX

DirectX 是由不少API組成的,DirectX並非一個單純的圖形API. 最重要的是DirectX是屬於 Windows上一個多媒體處理API.並不支持Windows之外的平臺,因此不是跨平臺框架. 按照性 質分類,能夠分爲四大部分,顯示部分、聲音部分、輸⼊部分和網絡部分。網絡

四、Metal

Metal 是Apple爲遊戲開發者推出了新的平臺技術 Metal,該技術可以爲 3D 圖 像提升 10 倍的渲染性能。Metal 是Apple爲了解決3D渲染⽽而推出的框架。架構

其實蘋果自14年推出Metal以後,就已經很明確的告訴你們,在極限性能方面,Metal的表現是要更加的出色的。由於他們對Metal作了不少針對性的優化,讓他在iOS的設備上能有一個更完美的發揮。 這裏也能夠看出,Metal是能夠取代OpenGL ES的。可是如今市場上面,依然仍是OpenGL ES的使用率更高。因此OpenGL ESMetal的關係就有點像是Objective-CSwift的關係同樣。框架

2、OpenGL專業名詞解析

一、OpenGL上下文(Context)

  • 在應用程序調用任何OpenGL指令以前,須要安排首先建立一個OpenGL的上下文。這個上下文是一個很是龐大的狀態機,保存了OpenGL中的各類狀態,這也是OpenGL指令執行的基礎。
  • 其實這裏的上下文,咱們能夠類比一下JSContext,我在以前的一篇講JSCore的博客裏面講到過這個東西。咱們在操做任何的對象的時候,都須要經過上下文去拿到對象,同時上下文裏面也記錄了不少的咱們須要使用的信息。
  • OpenGL的函數無論在哪一個語言中,都是相似C語言同樣的面向過程的函數,本質上面都是對OpenGL上下文這個龐大的狀態機中的某個狀態或者對象進行操做。固然你得首先把這個對象設置爲當前對象。所以,經過對OpenGL指令的封裝,是能夠將OpenGL的相關調用封裝成爲一個面向對象的圖形API的。
  • 因爲OpenGL上下文是一個巨大的狀態機,切換上下文每每會產生較大的開銷。可是不一樣的繪製模塊,可能須要使用徹底獨立的狀態管理。所以,能夠在應用程序中分別建立多個不一樣的上下文,在不一樣的線程中使用不一樣的上下文,上下文之間共享紋理、緩衝區等資源。這樣的方案,會比反覆切換上下文,或者大量修改渲染狀態,更加合理高效的。

二、OpenGL狀態機

狀態機理論上是一種機器,其實咱們能夠這樣去理解,狀態機描述了一個對象在其生命週期中所經歷的各類狀態,狀態之間的轉變,發生轉變的動因,條件以及轉變中所執行的活動。這一點上來講,跟JSContext也能夠類比一下。咱們的任何行爲都是依賴着狀態機的,狀態機會記錄全部的行爲,那麼咱們在須要使用某一個行爲的時候,也是能夠經過狀態機去拿出來某一個行爲。因此狀態機也是一種行爲,說明對象在其生命週期中相應事件所經歷的狀態序列以及對那些狀態事件的相應。函數

所以具備如下特色:

  • 有記憶功能,能記住其當前的狀態
  • 能夠接受輸入,根據輸入的內容和本身的原先狀態,修改本身當前狀態,而且能夠有對應輸出
  • 當進入特殊狀態(停機狀態)的時候,便再也不接收輸入,中止工做。

三、渲染(Rendering)

這個好理解,就是將圖形/圖像數據轉換成3D空間圖像操做叫作渲染。例如,在圖片或者視頻進行解碼以後,造成了一大堆的二進制文件,而後咱們將這一堆的二進制文件顯示到屏幕上面的過程就能夠理解爲渲染

四、頂點數組(VertexArray)

那麼什麼是頂點呢?頂點就是指咱們再繪製一個圖形的時候,他的頂點的位置數據,這個數據是能夠直接存儲在數組中或者將其緩存在GPU內存中的。若是存儲在數組中就構成了頂點數組。其實頂點數據就是咱們在畫畫的時候,最開始畫的一個大體的骨架。在OpenGL中的圖像都是由圖元組成。在OpenGL ES中,有三種圖元:點、線、三角形。咱們經過設定函數的指針,將頂點數據存儲在內存中,而後須要繪製的時候,直接從內存中取出來使用。這一部分的數據其實就是頂點數組

五、頂點緩衝區(VertexBuffer)

咱們上面說了,咱們在調用繪製方法的時候,直接就由內存傳入頂點數據。還有一種更加高性能的方法,就是提早分配一快內存,將頂點數據預先傳入到顯存當中,這部分的顯存,就叫作頂點緩衝區。值得注意的是,這一塊空間再也不內存中,而是在顯存的一塊空間中。

六、管線

由於咱們的GPU在處理數據的時候,是經過一個固定的順序來的,這個順序不能被打破。相似一個流水線的形式,因此被稱之爲管線。

七、固定管線/存儲着色器

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

八、着色器程序Shader

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

九、頂點着色器VertexShader

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

十、片元着色器 FragmentShader

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

十一、GLSL(OpenGL Shading language)

  • OpenGL着色語言(OpenGL Shading language)是用來在OpenGl中着色編程的語言,相似於C語言。他們是在圖形卡的GPU(Graphic Proccessor Unit圖形處理單元)上執行的。代替了固定的渲染管線的一部分,使渲染管線中不一樣層次具備可編程性。好比:視圖轉換、投影轉換等。GLSL的着色器代碼分紅兩個部分:頂點着色器和片斷着色器

十二、光柵化Rasterization

  • 是把頂點數據轉換成片元的過程,具備將圖轉化成爲一個個柵格組成的圖像的做用。特色是每一個元素對應幀緩衝區中的一個像素。
  • 光柵化就是把頂點數據轉換爲片元的過程。片元中的每個元素對應於幀緩衝區中的一個像素
  • 光柵化實際上是一種將幾何圖元變爲二維圖像的過程。該過程包含了兩部分的工做。第一部分工做:決定了窗口座標中哪些整型格柵區域被基本圖元佔用。第二部分工做:分配一個顏色值和一個深度值到各個區域。光柵化過程產生的是片元。
  • 把物體的數學描述以及與物體相關的顏色信息轉換爲屏幕上用於對應位置的像素及⽤於填充像素的顏色,這個過程稱爲光柵化,這是一個將模擬信號轉化爲離散信號的過程

1三、紋理

紋理能夠理解爲一個圖片,也就是位圖。⼤家在渲染圖形時須要在其編碼填充圖⽚,爲了使得場景更加逼真.⽽這里使⽤的圖片,就是常說的紋理.可是在OpenGL,咱們更加習慣叫紋理,⽽不是圖片。

1四、混合(Blending)

在測試階段以後,若是像素依然沒有被剔除,那麼像素的顏色將會和幀緩衝區中顏色附着上的顏色進行混合,混合的算法能夠經過OpenGL的函數進行指定。可是OpenGL提供的混合算法是有限的,若是須要更加複雜的混合 算法,⼀般能夠經過像素着⾊器進行實現,固然性能會比原生的混合算法差一些。

1五、變換矩陣(Transformation)

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

1六、投影矩陣(Projection)

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

1七、渲染上屏/交換緩衝區(SwapBuffer)

當咱們想把一個圖像渲染到窗口的時候,GPU會開闢一個渲染緩衝區。可是每個窗口又只有一個緩衝區,那麼若是在繪製的過程當中屏幕進行了刷新,窗口顯示的畫面就有可能不完整。爲了解決這個問題,常規的OpenGL程序至少都會有兩個緩衝區。顯示在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區,在一個緩衝區渲染完成以後,經過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上的顯示。在iOS中常常遇到的離屏渲染,其實就是雙緩衝區的機制引發的。若是這方面有疑問的,能夠移步iOS 保持界面流暢的技巧去了解。 使用了雙緩衝區和垂直同步技術以後,因爲老是要等待緩衝區交換以後再進行下一幀的渲染,使得幀率沒法徹底達到硬件容許的最高水平。爲了解決這個問題,引入了三緩衝區技術,在等待垂直同步時,來回交替渲染兩個離屏的緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區交換,實現充分利用硬件性能的目的。

相關文章
相關標籤/搜索