OpenGL,OpenGL ES,Metal詳解1

學(xué)習(xí)OpenGL、OpenGL ES、Metal等圖形API之前,我們需要先掌握一些相關(guān)的概念,否則在后面的學(xué)習(xí)中,提到相關(guān)概念的時(shí)候,會(huì)不知所云。

圖形API簡(jiǎn)介

OpenGL(Open Graphics Library):是一個(gè)跨編程語(yǔ)言、跨平臺(tái)的編程圖形程序入口,它將計(jì)算機(jī)的資源抽象稱為一個(gè)個(gè)OpenGL的對(duì)象,對(duì)這些資源的操作抽象為一個(gè)個(gè)的OpenGL指令。

OpenGL ES(OpenGL for Embedded Systems):是OpenGL三維圖形API的子集,針對(duì)手機(jī)、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì),去除了許多不必要和性能較低的API接口。

Metal :Apple為游戲開發(fā)者推出的新的平臺(tái)技術(shù),該技術(shù)能為3D圖像提高10倍的渲染性能。Metal是Apple為了解決3D渲染而推出的框架。

DirectX是由很多API組成的,DirectX并不是一個(gè)單純的圖形API。而且DirectX是屬于Windows上一個(gè)多媒體處理API,并不支持Windows以外的平臺(tái),可以分為四大部分,顯示部分、聲音部分、輸入部分、網(wǎng)絡(luò)部分。

圖形API的目的是解決什么問題?

簡(jiǎn)單來說就是實(shí)現(xiàn)圖形的底層渲染,比如:

  • 在音視頻開發(fā)中,對(duì)于視頻解碼后的數(shù)據(jù)渲染
  • 在游戲開發(fā)中,對(duì)于游戲場(chǎng)景、游戲人物的渲染
  • 在地圖引擎中,對(duì)于地圖上的數(shù)據(jù)渲染
  • 在動(dòng)畫中,實(shí)現(xiàn)動(dòng)畫的繪制
  • 在視頻處理中,為視頻加上濾鏡效果
    總的來說,OpenGL/OpenGL ES/Metal在任何項(xiàng)目中解決問題的本質(zhì)都是利用GPU芯片來高效渲染圖形圖像。

OpenGL專業(yè)名詞解析

OpenGL上下文(context)

在調(diào)用任何OpenGL指令之前,我們首先需要?jiǎng)?chuàng)建一個(gè)狀態(tài)機(jī)。這個(gè)上下文是一個(gè)非常龐大的狀態(tài)機(jī),保存了OpenGL中的各種狀態(tài),這也是OpenGL指令執(zhí)行的基礎(chǔ)。

OpenGL的函數(shù)不管是在哪個(gè)語(yǔ)言中,都是類似C語(yǔ)言一樣的面向過程的函數(shù),本質(zhì)上都是對(duì)OpenGL上下文這個(gè)龐大的狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行操作,當(dāng)然你得首先把這個(gè)對(duì)象設(shè)置為當(dāng)前對(duì)象。因此,通過對(duì)OpenGL指令的封裝,是可以將OpenGL的相關(guān)調(diào)用封裝成為一個(gè)面向?qū)ο蟮膱D片API的。

由于OpenGL上下文是一個(gè)巨大的狀態(tài)機(jī),切換上下文往往會(huì)產(chǎn)生較大的開銷,但是不同的繪制模塊,可能需要使用完全獨(dú)立的狀態(tài)管理。因此,可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文,在不同線程中使用不同的上下文,上下文之間共享紋理、緩沖區(qū)等資源。這樣的方案,會(huì)比反復(fù)切換上下文,或者大量修改渲染狀態(tài),更加合理高效的。

渲染

將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像的操作叫做渲染(Rendering)。

頂點(diǎn)數(shù)據(jù)(VertexArray)和頂點(diǎn)緩沖區(qū)(VertexBuffer)

畫圖一般是先畫好圖像的骨架,然后再往骨架里面填充顏色,這對(duì)于OpenGL也是一樣的。頂點(diǎn)數(shù)據(jù)就是要畫的圖像的骨架,和現(xiàn)實(shí)中不同的是,OpenGL中的圖像都是由圖元組成的。在OpenGL ES中,有3種類型的圖元:點(diǎn)、線、三角形。

那這些頂點(diǎn)數(shù)據(jù)最終是存儲(chǔ)在哪里呢?開發(fā)者可以選擇設(shè)定函數(shù)指針,在調(diào)用繪制方法的時(shí)候,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù),也就是說這部分?jǐn)?shù)據(jù)之前是存儲(chǔ)在內(nèi)存當(dāng)中的,被稱為頂點(diǎn)數(shù)組。而性能更高的做法是,提前分配一塊顯存,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng)中。這部分的顯存,就被成為定點(diǎn)緩沖區(qū)。

頂點(diǎn)指的是我們?cè)诶L制一個(gè)圖形時(shí),它的頂點(diǎn)位置數(shù)據(jù)。而這個(gè)數(shù)據(jù)可以直接存儲(chǔ)在數(shù)組中或者將其緩存到GPU內(nèi)存中。

管線

在OpenGL下渲染圖形,就會(huì)有經(jīng)歷一個(gè)一個(gè)節(jié)點(diǎn)的操作,而這樣的操作可以理解為管線。大家可以想象成流水線,每個(gè)任務(wù)類似流水線般執(zhí)行。任務(wù)之間有先后順序。管線是一個(gè)抽象的概念,之所以稱之為管線是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是按照一個(gè)固定的順序來的,而且嚴(yán)格按照這個(gè)順序。就像水從一根管子的一端流向另一端,這個(gè)順序是不能打破的。

固定管線/存儲(chǔ)著色器

在早期的OpenGL版本,它封裝了很多種著色器程序,內(nèi)置了一段包含光照、坐標(biāo)變換、裁剪等等諸多功能的固定shader程序來完成,來幫助開發(fā)者完成圖形的渲染。而開發(fā)者只需要傳入相應(yīng)的參數(shù),就能快速完成圖形的渲染。類似于iOS開發(fā)會(huì)封裝很多的API,而我們只需要調(diào)用這些API,就可以實(shí)現(xiàn)功能,不需要關(guān)注底層實(shí)現(xiàn)原理。

但是由于OpenGL的使用場(chǎng)景非常豐富,固定管線或者存儲(chǔ)著色器無法完成每一個(gè)業(yè)務(wù),這時(shí)就需要將相關(guān)的部分開放成可編程。

著色器程序Shader

就全面的將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€。因此OpenGL在實(shí)際調(diào)用繪制函數(shù)之前,還需要指定一個(gè)由shader編譯成的著色器程序。常見的著色器主要有頂點(diǎn)著色器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容