圖形API
要了解OpenGL,首先需要知道什么是圖形API挖藏。簡(jiǎn)單解釋圖形API就是圖形的底層渲染實(shí)現(xiàn)方法最楷。并且它是iOS開(kāi)發(fā)者唯?接近GPU
的?式。以下介紹OpenGL铲敛、OpenGL ES褐澎、DirectX、Metal圖形API伐蒋,而本文目的是記錄OpenGL相關(guān)名詞解釋工三,加深自己理解,提供交流學(xué)習(xí)先鱼!
?(Open Graphics Library)
:是一個(gè)的編程圖形程序接口,它將計(jì)算機(jī)的資源抽象成一個(gè)個(gè)
OpenGL
的對(duì)象焙畔,對(duì)這些資源的操作抽象為一個(gè)個(gè)的OpenGL
指令掸读。
?(OpenGL for Embedded Systems)
:是 OpenGL
三維圖形 API 的,針對(duì)?機(jī)宏多、PDA和游戲主機(jī)等嵌?式設(shè)備?設(shè)計(jì)儿惫,去除了許多不必要和性能較低的API接?。
?:是由很多API組成的伸但,DirectX并不是?個(gè)單純的圖形API肾请。 最重要的是DirectX是屬于
Windows
上?個(gè)多媒體處理框架,并且不?持Windows以外的平臺(tái)
更胖,所以不是跨平臺(tái)框架铛铁。 按照性質(zhì)分類,可以分為四?部分:顯示部分却妨、聲?部分饵逐、輸?部分和?絡(luò)部分。
?:Apple為游戲開(kāi)發(fā)者推出了新的平臺(tái)技術(shù)
Metal
管呵,該技術(shù)能夠?yàn)?3D 圖像提?10倍的渲染性能梳毙。Metal是Apple為了解決3D渲染而推出的框架。
OpenGL專業(yè)名詞
1.OpenGL 狀態(tài)機(jī)
?狀態(tài)機(jī)是理論上的?種機(jī)器捐下,描述了?個(gè)對(duì)象在其?命周期內(nèi)所經(jīng)歷的各種狀態(tài)账锹,狀態(tài)間的轉(zhuǎn)變,發(fā)?轉(zhuǎn)變的動(dòng)因坷襟,條件及轉(zhuǎn)變中所執(zhí)?的活動(dòng)奸柬。狀態(tài)機(jī)具有:1、記憶功能婴程;2廓奕、修改功能;3、停機(jī)功能桌粉。 還是以計(jì)算器計(jì)算為例:計(jì)算器輸入1+2+3-1x1蒸绩,先執(zhí)行1x1狀態(tài),然后記憶下1x1的結(jié)果铃肯,變成1+2+3-1患亿,然后1+2的狀態(tài)修改為3并保存下來(lái),以此類推得到狀態(tài)5押逼,停止計(jì)算步藕,直到繼續(xù)輸入計(jì)算。類推到OpenGL 中來(lái),可以這么理解:
? OpenGL可以記錄??的狀態(tài)(如當(dāng)前所使?的顏?挑格、是否開(kāi)啟了混合功能等)咙冗;
? OpenGL可以接收輸?(當(dāng)調(diào)?OpenGL函數(shù)的時(shí)候,實(shí)際上可以看成OpenGL在接收我們的輸?)漂彤,如我們調(diào)?glColor3f雾消,則OpenGL接收到這個(gè)輸?后會(huì)修改??的“當(dāng)前顏?”這個(gè)狀態(tài);
? OpenGL可以進(jìn)?停?狀態(tài)显歧,不再接收輸?仪或。在程序退出前,OpenGL總會(huì)先停??作的士骤。
2.OpenGL 上下? ( context )
?在應(yīng)用程序調(diào)用任何OpenGL
的指令之前,?先會(huì)創(chuàng)建OpenGL的上下?蕾域,這個(gè)上下?是?個(gè)?常龐?的狀態(tài)機(jī)拷肌,保存了OpenGL
中的各種狀態(tài),這也是OpenGL
指令執(zhí)?的基礎(chǔ)旨巷。OpenGL
的函數(shù)不管在哪個(gè)語(yǔ)?中巨缘,都是類似C語(yǔ)??樣的?向過(guò)程的函數(shù),本質(zhì)上都是對(duì)OpenGL
上下?這個(gè)龐?的狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)?操作采呐。因?yàn)?code>OpenGL上下?是?個(gè)巨?的狀態(tài)機(jī)切換上下?往往會(huì)產(chǎn)?較?的開(kāi)銷若锁,所以可以在應(yīng)?程序中分別創(chuàng)建多個(gè)不同的上下?,在不同線程中使?不同的上下?斧吐,上下?之間共享紋理又固、緩沖區(qū)等資源,這樣更加合理高效煤率。
?打個(gè)比方OpenGL 上下? ( context )
就是計(jì)算器計(jì)算一個(gè)結(jié)果的加仰冠、減、乘蝶糯、除過(guò)程洋只,計(jì)算結(jié)果就是你想要的圖形,而這個(gè)計(jì)算過(guò)程就是OpenGL 上下? ( context )
。比如1+7=8识虚;2*4=8肢扯。其中1,7担锤,2鹃彻,4就是OpenGL
中的各種狀態(tài)的對(duì)象,加和乘就是context
妻献,結(jié)果8就是最終你想要的圖形蛛株。
3.渲染
渲染:將圖形或者圖像數(shù)據(jù)轉(zhuǎn)換成2D空間圖像顯示到屏幕的操作叫做渲染(Rendering)
。
4.頂點(diǎn)數(shù)組( VertexArray )
和 頂點(diǎn)緩沖區(qū)( VertexBuffer )
? OpenGL
中的圖像是由圖元組成育拨,在OpenGL ES
中谨履,有3種類型的圖元:點(diǎn)、線熬丧、三?形笋粟。而圖像的輪廓就是頂點(diǎn)數(shù)據(jù),比如三角形就是三個(gè)頂點(diǎn)數(shù)據(jù)析蝴。在繪制圖像時(shí)將這些頂點(diǎn)數(shù)據(jù)存儲(chǔ)在內(nèi)存當(dāng)中害捕,我們稱為。
? 為提高性能闷畸,提前分配?塊顯存預(yù)存存入頂點(diǎn)數(shù)據(jù)尝盼,這部分的顯存,就被稱為佑菩。
5.管線
OpenGL
按照順序一個(gè)一個(gè)節(jié)點(diǎn)渲染圖形盾沫,這樣的操作可以稱之為。比如工廠生產(chǎn)肥皂??殿漠,由原料-->肥皂水-->模具-->肥皂塊的順序過(guò)程就是赴精。
6.固定管線/存儲(chǔ)著?器
經(jīng)過(guò)封裝的,不可改變的著色器程序塊稱為绞幌。比如管線舉例的模具固定為方形的蕾哟,因?yàn)槌杀竞托枨笤虿荒芨某扇切位蛭褰切恰?/p>
7.可編程管線
與固定管線相反,可以編程的著色器程序塊莲蜘,叫做可編程管線谭确。
8.著?器程序(Shader)
常?的著?器主要有頂點(diǎn)著?器(VertexShader)
,?段著色器(FragmentShader)
/像素著?器(PixelShader)
菇夸,?何著?器(GeometryShader)
琼富,曲?細(xì)分著?器(TessellationShader)
。
? 頂點(diǎn)著?器(VertexShader)
是OpenGL中?于計(jì)算頂點(diǎn)屬性(確定位置庄新、縮放鞠眉、平移薯鼠、旋轉(zhuǎn))的程序。每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)??次頂點(diǎn)著?器械蹋。
? 片元著色器(FragmentShader)
是OpenGL中?于計(jì)算?段(像素)顏?的程序出皇。
9.GLSL(OpenGL Shading Language)
GLSL(OpenGL Shading Language)
即是自定義且短小的用來(lái)在OpenGL中著色編程語(yǔ)言。
10.光柵化(Rasterization)
? 將頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過(guò)程哗戈;
? 將?何圖元變?yōu)?維圖像的過(guò)程郊艘;
? 將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過(guò)程。
11.紋理
可以理解為圖?唯咬,但是在OpenGL纱注,我們更加習(xí)慣叫紋理!
12.混合(Blending)
多顏色像素合并在一起的過(guò)程稱為混合胆胰。
13.變換矩陣(Transformation)
圖形想發(fā)?平移狞贱、縮放、旋轉(zhuǎn)變換.就需要使?變換矩陣蜀涨。
14.投影矩陣(Projection)
將3D坐標(biāo)轉(zhuǎn)換為?維屏幕坐標(biāo),實(shí)際線條也將在?維坐標(biāo)下進(jìn)?繪制瞎嬉。
15.渲染上屏/交換緩沖區(qū)(SwapBuffer)
屏幕顯示的圖像是通過(guò)窗口渲染緩沖區(qū)映射,每個(gè)窗口只有一個(gè)緩沖區(qū)厚柳,如果屏幕刷新氧枣,窗口就會(huì)顯示不完整的圖像。為解決此問(wèn)題别垮,常規(guī)的OpenGL程序?少都會(huì)有兩個(gè)緩沖區(qū):1.顯示在屏幕上的稱為屏幕緩沖區(qū)便监;2.沒(méi)有顯示的稱為離屏緩沖區(qū)。它們不斷切換的行為宰闰,就是交換緩沖區(qū)茬贵。
16.垂直同步信號(hào)
顯示器的刷新?般是逐?進(jìn)?的,因此為了防?交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè)不同的幀移袍,因此交換?般會(huì)等待顯示器刷新完成的信號(hào),在顯示器兩次刷新的間隔中進(jìn)?交換老充,這個(gè)信號(hào)就被稱為垂直同步信號(hào)葡盗。
17.三緩沖區(qū)技術(shù)
使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進(jìn)?下?幀的渲染啡浊,使得幀率無(wú)法完全達(dá)到硬件允許的最??平觅够。為了解決這個(gè)問(wèn)題,引?了三緩沖區(qū)技術(shù)巷嚣。在等待垂直同步時(shí)喘先,來(lái)回交替渲染兩個(gè)離屏的緩沖區(qū),?垂直同步發(fā)?生時(shí)廷粒,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換窘拯,實(shí)現(xiàn)充分利利?硬件性能的?的红且。
18.坐標(biāo)系
- 物體坐標(biāo),以物體為基準(zhǔn)的坐標(biāo)系涤姊。
- 世界坐標(biāo)暇番,以全局為基準(zhǔn)的坐標(biāo)系。
- 慣性坐標(biāo)思喊,用于做轉(zhuǎn)換運(yùn)算:物體坐標(biāo) <=> 慣性坐標(biāo) <=> 世界坐標(biāo)壁酬。
- 慣性坐標(biāo)的原點(diǎn)和物體坐標(biāo)一致,兩坐標(biāo)系通過(guò)旋轉(zhuǎn)轉(zhuǎn)換恨课。
- 慣性坐標(biāo)的X軸Y軸與世界坐標(biāo)水平舆乔,兩坐標(biāo)系通過(guò)平移轉(zhuǎn)換。
- 視窗坐標(biāo)剂公,我們手機(jī)窗口對(duì)應(yīng)的坐標(biāo)系統(tǒng)希俩,以左上角為原點(diǎn)(0,0),右下角對(duì)應(yīng)我們手機(jī)最大像素集合诬留,如果手機(jī)像素為1334*750斜纪,則右下角坐標(biāo)為(1334,750)。
- 規(guī)格化設(shè)備坐標(biāo)文兑,是以屏幕中心為原點(diǎn)盒刚,X軸朝右,Y軸朝上绿贞,所以左下角的坐標(biāo)為(-1,-1)因块,右上角坐標(biāo)為(1,1)。在規(guī)格化設(shè)備坐標(biāo)系需要考慮Z軸籍铁,需要將一個(gè)平面的思維轉(zhuǎn)為立體涡上,原點(diǎn)是(0,0,0)即立方體中心點(diǎn)。
- 視覺(jué)坐標(biāo)拒名,是從我們眼睛出發(fā)朝我們的手機(jī)設(shè)備看過(guò)去的坐標(biāo)吩愧,會(huì)有一個(gè)Z軸最遠(yuǎn)最近距離,只有在這兩者之間并且滿足X軸和Y軸坐標(biāo)在屏幕當(dāng)中的坐標(biāo)才會(huì)顯示增显,越遠(yuǎn)的顯示越小雁佳,產(chǎn)生透視效果。