一酷愧、什么是圖形API
OpenGL是一個(gè)跨編程語(yǔ)言箕昭、跨平臺(tái)的編程圖形程序接口歌憨,它講計(jì)算機(jī)的資源抽象成為一個(gè)OpenGL的對(duì)象,對(duì)這些資源的操作抽象為一個(gè)個(gè)OpenGL指令财饥。
OpenGL ES 是OpenGL三維圖形API的子集换吧,針對(duì)手機(jī)、PDA(掌上電腦)和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)钥星,去除了很多不必要的和性能較低的API接口沾瓦。
DirectX是由很多API組成的,DirectX并不是一個(gè)單純的圖形API谦炒。更重要的是DirectX是屬于Windows上的一個(gè)多媒體處理框架暴拄,且不支持Windows以外的平臺(tái),不屬于跨平臺(tái)框架编饺。按照性質(zhì)分類乖篷,可以分為:1、顯示部分2透且、聲音部分3撕蔼、輸入部分4、網(wǎng)絡(luò)部分秽誊。
Metal是蘋果為游戲開發(fā)者推出的新的平臺(tái)技術(shù)鲸沮,旨在解決3D渲染,該技術(shù)能夠?yàn)?D圖像提高10倍的渲染性能锅论。2014年到2018年apple將系統(tǒng)內(nèi)部從OpenGL ES到Matel,并于2018年宣布棄用OpenGL ES讼溺。
二、OpenGL名詞解析
1最易、紋理
紋理可以理解問圖片怒坯,在渲染圖形時(shí)為了使場(chǎng)景更加逼真炫狱,需要在頂點(diǎn)圍成的區(qū)域中填充圖片,這個(gè)圖片就是所謂的紋理剔猿,紋理只是OpenGL里的對(duì)圖片的稱呼视译。
2、OpenGL狀態(tài)機(jī)
狀態(tài)機(jī)描述了一個(gè)對(duì)象在其生命周期內(nèi)所經(jīng)歷的各種狀態(tài)归敬、狀態(tài)間的轉(zhuǎn)變酷含、發(fā)生轉(zhuǎn)變的原因、條件汪茧,及轉(zhuǎn)變中所執(zhí)行的活動(dòng)椅亚。
也可以說狀態(tài)機(jī)是一種行為,描述對(duì)象在其生命周期中響應(yīng)事件所經(jīng)歷的狀態(tài)序列以及對(duì)狀態(tài)事件的響應(yīng)舱污。
特點(diǎn):(1).有記憶功能呀舔,能記住當(dāng)前的狀態(tài);(2).可以接收輸入慌闭,根據(jù)輸入的內(nèi)容和自己原先的狀態(tài),修改自己當(dāng)前的狀態(tài)躯舔,且可以有對(duì)應(yīng)的輸出驴剔。(3).當(dāng)進(jìn)入特殊狀態(tài)(停機(jī)狀態(tài))的時(shí)候,便不再接收輸入粥庄,停止工作丧失。
OpenGL是一個(gè)狀態(tài)機(jī),記錄自己的狀態(tài)惜互,除非用戶輸入命令讓她改變自己的狀態(tài)布讹,OpenGL 接收輸入的一些方法:
可以使用glColor*函數(shù)來選擇一種顏色,以后繪制的所有物體都是這種顏色训堆,除非再次使用glColor*函數(shù)重新設(shè)定描验。
可以使用glTexCoord*函數(shù)來設(shè)置一個(gè)紋理坐標(biāo),以后繪制的所有物體都是采用這種紋理坐標(biāo)坑鱼,除非再次使用glTexCoord*函數(shù)重新設(shè)置膘流。
可以使用glBlendFunc函數(shù)來指定混合功能的源因子和目標(biāo)因子,以后繪制的所有物體都是采用這個(gè)源因子和目標(biāo)因子鲁沥,除非再次使用glBlendFunc函數(shù)重新指定呼股。
可以使用glLight*函數(shù)來指定光源的位置、顏色画恰,以后繪制的所有物體都是采用這個(gè)光源的位置彭谁、顏色,除非再次使用glBlendFunc函數(shù)重新指定
3允扇、OpenGL 上下文(Context)
在應(yīng)用程序中調(diào)用OpenGL指令前缠局,首先需要?jiǎng)?chuàng)建OpenGL的上下文则奥。上下文是一個(gè)非常大的狀態(tài)機(jī),保存了OpenGL中的各種狀態(tài)甩鳄,這也是OpenGL指令執(zhí)行的基礎(chǔ)逞度。
OpenGL函數(shù)式面向過程的函數(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的調(diào)用封裝成一個(gè)面向?qū)ο蟮膱D形API馆匿。
OpenGL上下文是一個(gè)龐大的狀態(tài)機(jī),切換上下文的開銷很大燥滑,但是不同的繪制模塊可能需要獨(dú)立的狀態(tài)管理渐北。因此,在應(yīng)用程序中創(chuàng)建多個(gè)不同的上下文铭拧,在不同的線程中調(diào)用不同的上下文赃蛛,這些上下文之間共享紋理,緩沖區(qū)等資源搀菩。會(huì)比反復(fù)切換上下文呕臂,或大量修改渲染狀態(tài)更加高效。
4肪跋、渲染
將圖形歧蒋、圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像的操作叫做渲染。
5州既、頂點(diǎn)數(shù)組和頂點(diǎn)緩沖區(qū)
頂點(diǎn)數(shù)據(jù)就是圖像的輪廓谜洽,OpenGL中的圖像都是由圖元組成。在OpenGL ES中吴叶,有三種類型的圖元:點(diǎn)阐虚,線,三角形蚌卤。
在調(diào)用繪制方法的時(shí)候敌呈,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù),也就是說這部分?jǐn)?shù)據(jù)之前時(shí)存儲(chǔ)在內(nèi)存當(dāng)中的造寝,被稱作頂點(diǎn)數(shù)組磕洪。
提前分配一塊顯存,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入顯存當(dāng)中诫龙,能夠讓性能更高效析显。這部分顯存被稱作頂點(diǎn)緩沖區(qū)。
6签赃、管線
管線是一個(gè)抽象的概念谷异,OpenGL下渲染圖形分尸,會(huì)經(jīng)歷一個(gè)一個(gè)節(jié)點(diǎn),這樣的操作可以理解為管線歹嘹。之所以叫管線是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是按照一個(gè)固定的順序來的箩绍,且嚴(yán)格執(zhí)行這個(gè)順序。
7尺上、固定管線/存儲(chǔ)著色器
在早起的OpenGL 版本材蛛,封裝了多種著色器程序塊,內(nèi)置了一段包含光照怎抛、坐標(biāo)轉(zhuǎn)換卑吭、裁剪等諸多功能的著色器(shader)程序,幫助開發(fā)者完成圖形的渲染马绝。開發(fā)者只需傳入?yún)?shù)調(diào)用即可完成圖形的渲染豆赏。
由于OpenGL使用場(chǎng)景非常豐富,固定管線或者存儲(chǔ)著色器無法完成每一個(gè)業(yè)務(wù)富稻,將相關(guān)部分開放成可編程掷邦。
8、光柵化
光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換成片元的過程椭赋,具有將圖片轉(zhuǎn)換成一個(gè)個(gè)柵格組成的圖像抚岗。特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)的一個(gè)像素。
光柵化是一種將幾何圖元變?yōu)槎S圖像的過程纹份,包括兩部分工作:1.決定窗口坐標(biāo)中的那些整型柵格區(qū)域被基本圖元占用苟跪;2.分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域廷痘,從而產(chǎn)生片元蔓涧。
光柵化是一個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過程:把物體的數(shù)學(xué)描述和顏色信息轉(zhuǎn)換成屏幕上用于對(duì)應(yīng)位置的像素和填充像素的顏色。
9笋额、著色器程序(shader)
將固定渲染管線架構(gòu)變成了可編程渲染管線元暴。
OpenGL在實(shí)際調(diào)用繪制函數(shù)之前,還需要指定一個(gè)由shader編譯成的著色器程序兄猩。常見的著色器程序有頂點(diǎn)著色器茉盏,片段著色器/像素著色器,幾何著色器枢冤,曲面細(xì)分著色器鸠姨。片段著色器和像素著色器只是在OpenGL和DirectX中的不同叫法。直到OpenGL ES3.0淹真,依然只支持頂點(diǎn)著色器和片段著色器讶迁。
OpenGL在處理shader是,和其他編譯器一樣核蘸,通過編譯巍糯、鏈接等步驟啸驯,生成著色器程序。著色器程序同時(shí)包含頂點(diǎn)著色器和片段著色器的運(yùn)算邏輯祟峦。
OpenGL繪制過程:首先由頂點(diǎn)著色器對(duì)傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算-->通過圖元裝配將頂點(diǎn)轉(zhuǎn)換成圖元-->然后進(jìn)行光柵化罚斗,將圖元這種矢量圖轉(zhuǎn)換成柵格化數(shù)據(jù)-->將柵格化數(shù)據(jù)傳入片段著色器進(jìn)行運(yùn)算。片段著色器對(duì)柵格化數(shù)據(jù)中的每一個(gè)像素進(jìn)行運(yùn)算宅楞,并決定像素的顏色针姿。
9.1、頂點(diǎn)著色器
頂點(diǎn)著色器是OpenGL中用于計(jì)算頂點(diǎn)屬性的程序咱筛。
一般來說典型的需要計(jì)算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)轉(zhuǎn)換搓幌,逐頂點(diǎn)關(guān)照運(yùn)算等等。頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)系的運(yùn)算迅箩,就是在這里發(fā)生的溉愁。
頂點(diǎn)著色器是逐頂點(diǎn)運(yùn)算的程序,也就是說每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)只從一次頂點(diǎn)著色器(并行)饲趋,且頂點(diǎn)著色器運(yùn)算過程中過無法訪問其他頂點(diǎn)的數(shù)據(jù)拐揭。
9.2、片元著色器程序
片段著色器是OpenGL中用于計(jì)算片段(像素)顏色的程序奕塑。一般用來處理圖形中每個(gè)像素點(diǎn)的顏色計(jì)算和填充堂污。
片段著色器是逐像素運(yùn)算的程序,也就是說每個(gè)像素都會(huì)執(zhí)行一次片元著色器(并行)龄砰。
10盟猖、GLSL
OpenGL 著色語(yǔ)言是用來在OpenGL中著色的語(yǔ)言,也就是開發(fā)人員寫的短小的自定義程序换棚,是在圖形卡的GPU上執(zhí)行式镐,代替了固定的渲染管線的一部分,是渲染管線中不同層次具有可編程性固蚤。GLSL的著色器代碼分成兩個(gè)部分:頂點(diǎn)著色器和片段著色器娘汞。
11、混合
在測(cè)試階段夕玩,如果像素依然沒有被剔除你弦,那么像素的顏色將會(huì)和幀緩沖區(qū)中附著的顏色混合×敲希混合的算法可以通過OpenGL的函數(shù)進(jìn)行指定禽作,但是OpenGL提供的混法算法有限,可以通過著色器實(shí)現(xiàn)更復(fù)雜的混合算法揩页,性能會(huì)比原生的差旷偿。
12、變換矩陣
可以用于圖形的平移,縮放狸捅,旋轉(zhuǎn)變換等
13衷蜓、投影矩陣
將3D坐標(biāo)轉(zhuǎn)換成為二維屏幕坐標(biāo),實(shí)際線條也將在二維坐標(biāo)下進(jìn)行繪制尘喝。
13磁浇、渲染上屏/交換緩沖區(qū)
渲染緩沖區(qū)一般映射的是系統(tǒng)的資源,就像窗口朽褪,如果將圖像直接渲染到窗口對(duì)應(yīng)的渲染緩沖區(qū)置吓,則可以將圖像顯示到屏幕上。*每個(gè)窗口只有一個(gè)緩沖區(qū)缔赠,如果在繪制過程中屏幕進(jìn)行了刷新衍锚,窗口可能顯示出不完整的圖像。
為了解決這個(gè)問題嗤堰,常規(guī)的OpenGL程序至少會(huì)有兩個(gè)緩沖區(qū)戴质。顯示在屏幕上的稱為屏幕緩沖區(qū),沒有顯示的稱為離屏緩沖區(qū)踢匣。在一個(gè)緩沖區(qū)渲染完成后告匠,通過屏幕緩沖區(qū)和離屏緩沖區(qū)交換,實(shí)現(xiàn)圖像在屏幕上的顯示离唬。
由于顯示器是逐行刷新的后专,為了防止緩沖區(qū)交換的時(shí)候,屏幕上下的區(qū)域分屬兩個(gè)不同的幀输莺,所以交換動(dòng)作會(huì)等待屏幕刷新完成的信號(hào)戚哎,這個(gè)信號(hào)叫做垂直同步信號(hào),緩沖區(qū)交換過程在兩次屏幕刷新之間進(jìn)行嫂用。
在使用雙緩沖區(qū)和垂直同步信號(hào)后型凳,需要在緩沖區(qū)交換完成后才會(huì)進(jìn)行下一幀的渲染,這樣幀率無法達(dá)到硬件允許的最高水平尸折。為了解決這個(gè)問題啰脚,引入了三緩沖區(qū)技術(shù)殷蛇。有兩個(gè)離屏緩沖區(qū)实夹,垂直同步發(fā)生時(shí),屏幕緩沖區(qū)和最近完成的離屏緩沖區(qū)交換粒梦。