圖形API簡(jiǎn)介
OpenGL
OpenGL (Open Graphics Library)是一個(gè)用于渲染2D恋昼、3D矢量圖形的跨編程語(yǔ)言猎荠、跨平臺(tái)的應(yīng)用程序編程接口娱俺。它將計(jì)算機(jī)的資源抽象成為一個(gè)個(gè) OpenGL 對(duì)象裹驰,對(duì)這些資源的操作抽象成為一個(gè)個(gè) OpenGL 指令派撕。
OpenGL ES
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形應(yīng)用程序接口的子集婉弹,針對(duì)手機(jī)、Pad和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)终吼,去除了許多不必要的和性能較低的 API 接口
DirectX
DirectX 是由微軟公司創(chuàng)建的一系列專為多媒體以及游戲開(kāi)發(fā)的應(yīng)用程序接口镀赌。旗下包含Direct3D、Direct2D际跪、DirectCompute等等多個(gè)不同用途的子部分商佛,因?yàn)檫@一系列 API 皆以 Direct 字樣開(kāi)頭,所以 DirectX(只要把X字母替換為任何一個(gè)特定API的名字)就成為這一巨大的API系列的統(tǒng)稱姆打。
它并不支持 Windows 以外的平臺(tái)良姆,所以不是跨平臺(tái)框架。按照性質(zhì)分類幔戏,可以分為四大部分:顯示部分歇盼、聲音部分、輸入部分和網(wǎng)絡(luò)部分评抚。
Metal
Metal 是蘋(píng)果公司為游戲開(kāi)發(fā)推出的新的平臺(tái)技術(shù)豹缀,該技術(shù)能夠?yàn)?3D 圖像提高 10 倍的渲染性能伯复。Metal 是為了解決 3D 渲染而推出的框架。
OpenGL 常用的專業(yè)名詞
上下文 [context]
- 在應(yīng)用程序調(diào)用 OpenGL 的指令之前邢笙,都需要先創(chuàng)建一個(gè) OpenGL 的上下文啸如。這個(gè)上下文其實(shí)就是一個(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)行操作,當(dāng)然你得首先把這個(gè)對(duì)象設(shè)置為當(dāng)前對(duì)象。因此诱鞠,通過(guò)對(duì) OpenGL 指令的封裝,是可以將 OpenGL 的相關(guān)調(diào)用封裝成為一個(gè)面向?qū)ο蟮膱D形 API 的
- 由于 OpenGL 上下文是一個(gè)巨大的狀態(tài)機(jī)膝蜈,切換上下文會(huì)產(chǎn)生較大的開(kāi)銷乙漓,但是不同的繪制模塊,可能需要使用完全獨(dú)立的狀態(tài)管理互婿。因此捣郊,可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文,在不同線程中使用不同的上下文慈参,上下文之間共享紋理呛牲、緩沖區(qū)等資源。這樣的方案驮配,會(huì)比反復(fù)切換上下文娘扩,或者大量修改渲染狀態(tài),更加合理高效壮锻。
OpenGL 狀態(tài)機(jī)
- 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)入停止?fàn)顟B(tài),不再接收輸入途事。在程序退出前验懊,OpenGL 總會(huì)先停止工作。
渲染 [Rendering]
渲染是將圖形尸变、圖像义图、視頻等顯示繪制到屏幕的過(guò)程
OpenGL 中的圖像都是由圖元組成的。在 OpenGL 中召烂,有三種類型的圖元:點(diǎn)碱工、線、三角形。
頂點(diǎn)
頂點(diǎn)指的是我們?cè)诶L制一個(gè)圖形時(shí)怕篷,它的頂點(diǎn)位置數(shù)據(jù)历筝。
頂點(diǎn)數(shù)組 [VertexArray]
頂點(diǎn)數(shù)組是在調(diào)用繪制方法的時(shí)候,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù)廊谓,這部分?jǐn)?shù)據(jù)是之前就存在內(nèi)存中的梳猪。
頂點(diǎn)緩存區(qū) [VertexBuffer]
基于頂點(diǎn)數(shù)組的流程,我們可以提前分配一塊顯存蒸痹,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng)中春弥。這部分的顯存就被稱為頂點(diǎn)緩沖區(qū)。
管線/存儲(chǔ)著色器
在 OpenGL 的渲染過(guò)程中叠荠,會(huì)經(jīng)歷一個(gè)個(gè)節(jié)點(diǎn)匿沛,而這樣的操作就被稱為管線。也可以想象成流水線榛鼎。每個(gè)任務(wù)類似流水線般執(zhí)行逃呼。任務(wù)之間有先后順序。之所以稱之為管線借帘,是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是嚴(yán)格按照一個(gè)固定的順序來(lái)處理的。
固定管線/固定存儲(chǔ)著色器
- 封裝了很多種著色器程序塊淌铐,它內(nèi)置的一段包含了光照肺然、坐標(biāo)轉(zhuǎn)換、裁剪等諸多功能的固定 shader 程序來(lái)幫助開(kāi)發(fā)者完成圖形的渲染腿准。開(kāi)發(fā)者只需要傳入相應(yīng)的參數(shù)际起,就能快速完成圖形的渲染。類似于直接調(diào)用API吐葱,直接調(diào)用即可實(shí)現(xiàn)相應(yīng)的功能街望,而不用關(guān)心底層原理。
- 代碼段 (蘋(píng)果提供API) —> 調(diào)用參數(shù) (OpenGL提供)
可編程管線
- 當(dāng)固定管線或存儲(chǔ)著色器無(wú)法完成每一個(gè)業(yè)務(wù)時(shí)弟跑,這時(shí)將相關(guān)的部分開(kāi)發(fā)出來(lái)讓開(kāi)發(fā)者可以進(jìn)行自定義編程
- 基于 GLSL語(yǔ)法來(lái)進(jìn)行編寫(xiě)代碼段
著色器
著色器是一種計(jì)算機(jī)程序灾前。原本用于進(jìn)行圖像的濃淡處理(計(jì)算圖像中的光照、亮度孟辑、顏色等)哎甲,但近來(lái),它也被用于完成很多不同領(lǐng)域的工作饲嗽,比如處理CG特效炭玫、進(jìn)行與濃淡無(wú)關(guān)的影片后期處理、甚至用于一些與計(jì)算機(jī)圖形學(xué)無(wú)關(guān)的其它領(lǐng)域貌虾。
它其實(shí)也可以被理解為是 CPU 使用的函數(shù)/方法吞加,GPU中的代碼段(shader)
固定著色器/存儲(chǔ)著色器
頂點(diǎn)著色器
- 一般用來(lái)處理圖形每個(gè)頂點(diǎn)變換【旋轉(zhuǎn)、平移、投影等】
- 頂點(diǎn)著色器是 OpenGL 中用于計(jì)算頂點(diǎn)屬性的程序衔憨。頂點(diǎn)著色器是逐頂點(diǎn)運(yùn)算的程序叶圃,也就是說(shuō)每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)行一次頂點(diǎn)著色器,它是并行的巫财,并且頂點(diǎn)著色器運(yùn)算過(guò)程中無(wú)法訪問(wèn)其它頂點(diǎn)的數(shù)據(jù)盗似。
典型的需要計(jì)算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)轉(zhuǎn)換、逐頂點(diǎn)光照運(yùn)算等平项。頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一坐標(biāo)系的運(yùn)算赫舒,就是在這里發(fā)生的。
片元著色器
- 片元著色器又叫片段著色器或像素著色器
- 一般用來(lái)處理圖形中每個(gè)像素點(diǎn)顏色的計(jì)算和填充
- 片元著色器是 OpenGL 中用于計(jì)算片段(像素)顏色的程序闽瓢。片元著色器是逐像素運(yùn)算的程序接癌,也就是說(shuō)每個(gè)像素都會(huì)執(zhí)行一次片元著色器,當(dāng)然也是并行執(zhí)行的
栗子:120 * 120 像素點(diǎn) —> 14400次 —> GPU運(yùn)算
GLSL
GLSL(OpenGL Shading Language)是 OpenGL 的著色編程語(yǔ)言扣讼,它代替了固定渲染管線的一部分缺猛,使得渲染管線在不同層次上具有了可編輯性。比如:視圖轉(zhuǎn)換椭符、投影等荔燎。
GLSL 的著色器代碼可以分為兩個(gè)部分:頂點(diǎn)著色器和片元著色器
光柵化
光柵化可以分為兩個(gè)部分。一是先確定圖形在屏幕中的像素范圍销钝。二是在確定的像素范圍內(nèi)著色有咨。
紋理
- 紋理其實(shí)就是圖片
- 在 OpenGL 中,是 .tga 紋理文件
- 在 OpenGL ES 移動(dòng)端中蒸健,其實(shí)就是將圖片轉(zhuǎn)換成了位圖
混合
當(dāng)該像素點(diǎn)上顏色還未剔除的時(shí)候座享,有新的顏色需要著色在該像素點(diǎn)中,那么就要進(jìn)行顏色的混合似忧,它由 OpenGL 中提供混合算法(也就是函數(shù))渣叛。
但是 OpenGL 中提供的算法是有限的,所以可以通過(guò)像素著色器來(lái)進(jìn)行實(shí)現(xiàn)盯捌,但是性能會(huì)差些
變換矩陣
記錄圖形在發(fā)生平移淳衙、旋轉(zhuǎn)、縮放時(shí)候頂點(diǎn)發(fā)生的變化
投影矩陣
用于將 3D 坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo)
投影方式
投影方式分為兩種:正投影和透視投影
- 1饺著、正投影:1 : 1繪制滤祖,顯示 2D 效果
- 2、透視投影:遠(yuǎn)小近大效果瓶籽,3D 效果顯示在二維屏幕中
渲染上屏/交換緩沖區(qū)(SwapBuffer)
- 渲染緩沖區(qū)一般是系統(tǒng)的窗口緩沖區(qū)匠童。如果將圖像直接渲染到窗口對(duì)應(yīng)的緩沖區(qū),則可以直接將圖像顯示到屏幕上
- 但是每個(gè)窗口只有一個(gè)緩沖區(qū)塑顺,如果在繪制的過(guò)程中進(jìn)行了刷新汤求,窗口則可能顯示不完整的圖像
- 為了解決上訴的問(wèn)題俏险,常規(guī)的 OpenGL 會(huì)有雙緩沖區(qū)。顯示在屏幕上的成為屏幕緩沖區(qū)扬绪,未顯示在屏幕上的成為離屏緩沖區(qū)竖独。在一個(gè)緩沖區(qū)渲染完成后,通過(guò)將屏幕緩沖區(qū)和離屏緩沖區(qū)進(jìn)行切換挤牛,實(shí)現(xiàn)圖像在屏幕上的顯示
- 由于顯示器的刷新一般是逐行進(jìn)行的莹痢,所以為了防止交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè)緩沖區(qū),因此交換會(huì)等待顯示器刷新完成的信號(hào)墓赴,在顯示器兩次刷新的間隔中進(jìn)行交換竞膳,這個(gè)信號(hào)被稱為垂直同步信號(hào),這個(gè)技術(shù)被稱為垂直同步
- 使用了雙緩沖區(qū)和垂直同步信號(hào)后诫硕,由于總要等待緩沖區(qū)交換之后在進(jìn)行下一幀的渲染坦辟,使得幀率無(wú)法完全達(dá)到硬件允許的最高水平。所以引進(jìn)了三緩沖區(qū)章办,即在等待垂直同步信號(hào)之前锉走,來(lái)回交替兩個(gè)離屏緩沖區(qū),而垂直同步信號(hào)到來(lái)時(shí)藕届,屏幕緩沖區(qū)會(huì)和最近渲染完成的離屏緩沖區(qū)進(jìn)行交換
坐標(biāo)系
- 物體坐標(biāo)系/對(duì)象坐標(biāo)
- 世界坐標(biāo)系
- 觀察者坐標(biāo)系/攝像機(jī)坐標(biāo)系
- 裁剪坐標(biāo)系
- 規(guī)范化設(shè)備坐標(biāo)系
- 屏幕坐標(biāo)系