OpenGL 常用的專業(yè)名詞

圖形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)用程序接口镀赌。旗下包含Direct3DDirect2D际跪、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)系
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挪蹭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子休偶,更是在濱河造成了極大的恐慌梁厉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椅贱,死亡現(xiàn)場(chǎng)離奇詭異懂算,居然都是意外死亡只冻,警方通過(guò)查閱死者的電腦和手機(jī)庇麦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喜德,“玉大人山橄,你說(shuō)我怎么就攤上這事∩崦酰” “怎么了航棱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萌衬。 經(jīng)常有香客問(wèn)我饮醇,道長(zhǎng),這世上最難降的妖魔是什么秕豫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任朴艰,我火速辦了婚禮观蓄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祠墅。我一直安慰自己侮穿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布毁嗦。 她就那樣靜靜地躺著亲茅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狗准。 梳的紋絲不亂的頭發(fā)上克锣,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音驶俊,去河邊找鬼娶耍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饼酿,可吹牛的內(nèi)容都是我干的榕酒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼故俐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼想鹰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起药版,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辑舷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后槽片,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體何缓,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年还栓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碌廓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剩盒,死狀恐怖谷婆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辽聊,我是刑警寧澤纪挎,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站跟匆,受9級(jí)特大地震影響异袄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玛臂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一烤蜕、第九天 我趴在偏房一處隱蔽的房頂上張望埠帕。 院中可真熱鬧,春花似錦玖绿、人聲如沸敛瓷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呐籽。三九已至,卻和暖如春蚀瘸,著一層夾襖步出監(jiān)牢的瞬間狡蝶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工贮勃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贪惹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓寂嘉,卻偏偏與公主長(zhǎng)得像奏瞬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泉孩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355