圖形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接口。
·DirectX是由很多API組成的笤虫,DirectX并不是一個(gè)單純的圖形API搁廓,最重要的是DirectX是屬于Windows上的一個(gè)多媒體處理API引颈,并支持Windows以外的平臺(tái),所以不是跨平臺(tái)框架境蜕,按照性質(zhì)分類蝙场,可以分為四大部分,顯示部分粱年、聲音部分售滤、輸入部分、網(wǎng)絡(luò)部份
圖形API目的是解決什么問題
A 游戲開發(fā)中台诗,對(duì)于游戲場(chǎng)景/人物的渲染
B 音視頻開發(fā)中完箩,對(duì)于視頻解碼后的數(shù)據(jù)渲染
C 地圖引擎,對(duì)于地圖上的數(shù)據(jù)渲染
D 動(dòng)畫中拉队,實(shí)現(xiàn)動(dòng)畫繪制
E 視頻處理中弊知,對(duì)于視頻加上濾鏡效果
本質(zhì)上是利用GPU芯片來(lái)高效渲染圖形圖像
OpenGL專業(yè)名詞解析
1、OpenGL上下文【context】
·在調(diào)用OpenGL指令之前粱快,需要首先創(chuàng)建一個(gè)OpenGL的上下文秩彤,這個(gè)上下文是一個(gè)龐大的狀態(tài)機(jī),保存了OpenGL的各種狀態(tài)事哭,也是指令執(zhí)行的基礎(chǔ)漫雷;
·OpenGL是類似C語(yǔ)言一樣的面向過程的函數(shù),本質(zhì)上實(shí)對(duì)上下文中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行操作鳍咱。
·切換上下文會(huì)產(chǎn)生巨大的開銷降盹,因此可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文,在不同線程中使用不同的上下文谤辜,上下文之間共享紋理蓄坏、緩沖區(qū)等資源。
2丑念、OpenGL狀態(tài)機(jī)
狀態(tài)機(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ī)是一種行為,說(shuō)明對(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í)候,便不再接受輸入内贮,停止工作产园;
3汞斧、渲染 Rendering
將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像操作
4、頂點(diǎn)數(shù)組【VertexArray】和頂點(diǎn)緩沖區(qū)【VertexBuffer】
OpenGL中的圖像都是由圖元構(gòu)成的什燕,在OpenGL ES中有3種類型的圖元:點(diǎn)粘勒、線、三角形屎即。頂點(diǎn)數(shù)據(jù)存儲(chǔ)在內(nèi)存種庙睡,調(diào)用繪制方法時(shí)直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)組,性能更高的做法是提前分配一塊顯存技俐,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入顯存中乘陪,這部分顯存被稱為頂點(diǎn)緩沖區(qū)。
5雕擂、管線
渲染圖形經(jīng)歷的一個(gè)一個(gè)節(jié)點(diǎn)啡邑,可以理解成流水線
6、固定管線/存儲(chǔ)著色器
封裝了很多種著色器程序塊內(nèi)置的一段包含了光照井赌、坐標(biāo)變換谤逼、裁剪等功能的固定shader程序來(lái)完成。
7族展、著色器程序shader
將固定渲染管線架構(gòu)變成了可編程渲染管線,OpenGL在實(shí)際調(diào)用繪制函數(shù)之前還需要指定一個(gè)由shader編譯成的著色器程序拔鹰,常見的著色器主要有頂點(diǎn)著色器(VertexShader)仪缸,片段著色器(FragmentShader)/像素著色器(PixelShader),幾何著色器(GeometryShader)列肢,曲面細(xì)分著色器(TessellationShader)恰画。在OpenGL進(jìn)行繪制的時(shí)候,首先由頂點(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)算怀骤,片段著色器會(huì)對(duì)柵格化數(shù)據(jù)中的每一個(gè)像素進(jìn)行運(yùn)算费封,并決定像素的顏色。
8蒋伦、頂點(diǎn)著色器VertexShader
每個(gè)頂點(diǎn)都會(huì)執(zhí)行一次頂點(diǎn)著色器弓摘,這個(gè)過程是并行的,并且頂點(diǎn)著色器運(yùn)算過程中無(wú)法訪問其他頂點(diǎn)的數(shù)據(jù)
9痕届、片元著色器FragmentShader
一般用來(lái)處理圖形中每個(gè)像素點(diǎn)顏色計(jì)算和填充韧献,每個(gè)像素都會(huì)并行進(jìn)行一次片元著色器
10末患、GLSL【OpenGL Shading Language】
OpenGL著色語(yǔ)言,在圖形卡的GPU上執(zhí)行的锤窑,代替了固定的渲染管線的一部分璧针,使渲染管線中不同層次具有可編程性
11、光柵化Rasterization
把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程果复,具有將圖轉(zhuǎn)換為一個(gè)個(gè)柵格組成的圖像的作用陈莽,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的一個(gè)像素,將幾何圖元轉(zhuǎn)變?yōu)槎S圖像的過程虽抄,包含兩部份工作:(1)決定窗口坐標(biāo)中的哪些整形柵格區(qū)域被基本圖元占用走搁;(2)分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域,光柵化過程產(chǎn)生的是片元
12迈窟、紋理
可以理解為圖片
13私植、混合Blending
在測(cè)試階段之后,如果像素依然沒有被剔除车酣,那么像素的顏色將會(huì)和幀緩和區(qū)中顏色附著上的顏色進(jìn)行混合曲稼。
14、變換矩陣Transformation
用于平移湖员、縮放贫悄、旋轉(zhuǎn)變換
15、投影矩陣Projection
用于將3D坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo)
16娘摔、渲染上屏/交換緩沖區(qū)SwapBuffer
OpenGL程序至少有兩個(gè)緩沖區(qū)窄坦,顯示在屏幕上的稱為屏幕緩沖區(qū),沒有顯示的稱為離屏緩沖區(qū)凳寺,由于顯示器的刷新一般是逐行進(jìn)行的鸭津,因此為了防止交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè)不同的幀,因此交換一般會(huì)等待顯示器刷新完成的信號(hào)肠缨,在顯示器兩次刷新的間隔中進(jìn)行交換逆趋,這個(gè)信號(hào)被稱為垂直同步信號(hào)
17、投影方式
透視投影 物體遠(yuǎn)小近大更加有空間感
正交投影 物體不會(huì)隨距離視點(diǎn)遠(yuǎn)近發(fā)生大小變化
18晒奕、OpenGL坐標(biāo)系
OpenGL中坐標(biāo)系都屬于右手坐標(biāo)系闻书,而規(guī)范化設(shè)備坐標(biāo)系使用左手坐標(biāo)系,籠統(tǒng)說(shuō)OpenGL使用右手坐標(biāo)系是不合適的脑慧。