OpenGL簡(jiǎn)介

前言

計(jì)算機(jī)圖形學(xué)是一門(mén)很有趣的學(xué)科,但是它涉及的知識(shí)面太廣,不僅包含軟件方面還有硬件方面也有滲透汞斧。而對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō)滔驶,學(xué)習(xí)OpenGL無(wú)疑是接近計(jì)算機(jī)圖形學(xué)的最便捷方式遇革。

從這篇文章開(kāi)始,會(huì)出一系列OpenGL的文章揭糕,還包括了移動(dòng)開(kāi)發(fā)中的OpenGL ES萝快、Metal。文章的目的很簡(jiǎn)單著角,就是作為一種筆記來(lái)復(fù)習(xí)從OpenGL到OpenGL ES學(xué)習(xí)中的知識(shí)點(diǎn)揪漩,筆記實(shí)際應(yīng)用開(kāi)發(fā)中能否用到OpenGL也得看業(yè)務(wù)需求。同時(shí)也希望能夠幫助到還未入門(mén)的小伙伴吏口。

在文章中奄容,如果出現(xiàn)了一些知識(shí)點(diǎn)有錯(cuò)誤冰更、或是有遺漏的地方,希望小伙伴們能夠在文章末尾留言指出嫩海,不勝感激冬殃。

本文主要講述OpenGL的基礎(chǔ)知識(shí),包括它的應(yīng)用叁怪、子集审葬、部分專(zhuān)業(yè)名稱(chēng)、固定管線奕谭、可編程管線等涣觉。從下篇文章開(kāi)始編碼,動(dòng)手去繪制一些圖元血柳、圖形等官册。

學(xué)習(xí)過(guò)程中參考書(shū)籍:《OpenGL超級(jí)寶典 第5版》、《3D數(shù)學(xué)基礎(chǔ):圖形與游戲開(kāi)發(fā)》难捌、《OpenGL ES 3.0》膝宁。其中3D數(shù)學(xué)只需看前9章。

一根吁、OpenGL是什么

1.OpenGL

用一句話概括员淫,OpenGL是一個(gè)代碼庫(kù)。它是基于C語(yǔ)言開(kāi)發(fā)的一組可跨平臺(tái)的圖形API击敌,它是程序員最接近GPU的方式介返,它是界面渲染的主要成員,它肩負(fù)著圖形圖像顯示到屏幕上的重任沃斤。但OpenGL從本質(zhì)上講圣蝎,還是一個(gè)代碼庫(kù),只不過(guò)我們不僅要會(huì)用它衡瓶,還要了解圖形的渲染流程徘公。

2.DirectX

DirectX是與OpenGL齊名的另一組庫(kù),能做OpenGL做的事哮针。它活躍在PC上关面,且只支持windows系統(tǒng),這里知道下就OK诚撵,畢竟筆者也不怎么了解DirectX缭裆。

3.OpenGL ES

從命名上看多少能猜出它和OpenGL的關(guān)系,沒(méi)錯(cuò)寿烟,OpenGL ES是OpenGL的子集澈驼,活躍在移動(dòng)端,目前Android和iOS的渲染都用到了OpenGL ES筛武。不過(guò)蘋(píng)果總有些騷操作缝其,在2014年開(kāi)始布局Metal挎塌,到2018年宣布3D圖形用Matal渲染,據(jù)說(shuō)能提高10倍的渲染速度内边,我相信是真的??榴都。目前比較流行的flutter,2D渲染用的是skia漠其,3D渲染用的是OpenGL ES嘴高。對(duì)于移動(dòng)開(kāi)發(fā)者來(lái)說(shuō),掌握OpenGL ES還是利好的和屎。

二拴驮、OpenGL中的專(zhuān)業(yè)名詞

OpenGL中的專(zhuān)業(yè)名詞有很多,這里只列舉比較常見(jiàn)的五個(gè)名詞:光柵化柴信、紋理套啤、著色器、顏色混合随常、深度測(cè)試潜沦。直接去理解這些名詞其實(shí)是不好理解的,而且這里沒(méi)有涉及到上下文所以如果理解上有困難是正常的绪氛,在后面會(huì)將這些名詞代表的過(guò)程連串起來(lái)唆鸡,那時(shí)才能真正理解它們的意義,這里只是預(yù)理解钞楼。

1.光柵化

OpenGL中組成圖像的基本圖元有點(diǎn)喇闸、線袄琳、三角形询件、線帶、線環(huán)唆樊、三角帶宛琅、三角環(huán),但最終還是由點(diǎn)逗旁、線嘿辟、三角形組成。那么當(dāng)你給出三個(gè)不在同一直線上的點(diǎn)讓OpenGL去繪制一個(gè)三角形時(shí)片效,三角形范圍內(nèi)點(diǎn)的位置計(jì)算的過(guò)程叫光柵化红伦,這是用通俗的語(yǔ)言來(lái)描述的。

專(zhuān)業(yè)一點(diǎn)的解釋?zhuān)?br> ? 光柵化是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過(guò)程淀衣,具有將圖轉(zhuǎn)化為?個(gè)個(gè)柵格組成的圖象的作?昙读,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的?像素。

? 光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過(guò)程膨桥。?元中的每?個(gè)元素對(duì)應(yīng)于幀緩沖區(qū)中的?個(gè)像素蛮浑。

? 光柵化其實(shí)是?種將?何圖元變?yōu)?維圖像的過(guò)程唠叛。該過(guò)程包含了兩部分的?作。第?部分?作:決定窗?坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占?沮稚;第?部分?作:分配?個(gè)顏?值和?個(gè)深度值到各個(gè)區(qū)域艺沼。光柵化過(guò)程產(chǎn)?的是?元。

? 把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏?信息轉(zhuǎn)換為屏幕上?于對(duì)應(yīng)位置的像素及?于填充像素的顏?蕴掏,這個(gè)過(guò)程稱(chēng)為光柵化障般,這是?個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過(guò)程。

如果看到這里還是一頭污水盛杰,沒(méi)有關(guān)系剩拢,繼續(xù)往后,能找到你想要的答案饶唤。

2.紋理

如果說(shuō)紋理你不好理解徐伐,那我說(shuō)個(gè)你肯定知道的,那就是圖片募狂。沒(méi)錯(cuò)办素,紋理你可以理解成就是圖片,只不過(guò)OpenGL中通常稱(chēng)為紋理祸穷。

3.著色器

著色器性穿,對(duì)圖形的頂點(diǎn)以及光柵化之后的片元進(jìn)行位置顏色計(jì)算的程序。固定管線下有多種著色器雷滚,具體可以參考這篇文章http://www.reibang.com/p/8005dcd0dec7需曾。在這里我簡(jiǎn)單說(shuō)下頂點(diǎn)著色器和片元著色器,而這兩種著色器也是我們唯一能夠編程的著色器祈远。

a.頂點(diǎn)著色器
顧名思義呆万,頂點(diǎn)著色器是對(duì)圖形的頂點(diǎn)進(jìn)行計(jì)算的,包括平移车份、旋轉(zhuǎn)谋减、縮放等矩陣變換的計(jì)算。例如扫沼,一個(gè)三角形發(fā)生一次旋轉(zhuǎn)出爹,頂點(diǎn)著色器會(huì)對(duì)其進(jìn)行3次計(jì)算,三角形有三個(gè)頂點(diǎn)缎除,就是這個(gè)原因严就。總的來(lái)講器罐,頂點(diǎn)著色器用來(lái)對(duì)頂點(diǎn)的一些屬性進(jìn)行計(jì)算梢为。

b.片元著色器
片元可以理解成像素,也就是圖形上每一個(gè)像素點(diǎn)。而片元著色器是對(duì)每一個(gè)像素點(diǎn)進(jìn)行計(jì)算的抖誉。光柵化過(guò)程將頂點(diǎn)轉(zhuǎn)化成了片元殊轴,例如,將一個(gè)三角形內(nèi)部的每個(gè)點(diǎn)的坐標(biāo)和顏色值計(jì)算出來(lái)后交給了片元著色器袒炉,這時(shí)就開(kāi)始了片元著色器的操作旁理。制作濾鏡就是在片元著色器程序中完成的,利用顏色混合我磁,達(dá)到不同的濾鏡效果孽文。

注意:由于一個(gè)圖形可能是多個(gè)三角形組成,而每個(gè)圖形內(nèi)部的像素點(diǎn)特別多夺艰,如果是串行去出來(lái)每個(gè)點(diǎn)的計(jì)算芋哭,那么對(duì)于用戶(hù)將是一場(chǎng)災(zāi)難,因?yàn)槟憧赡苄枰却龜?shù)秒才能看到屏幕成像郁副。GPU對(duì)頂點(diǎn)减牺、片元的計(jì)算都是并行的,這也是它擅長(zhǎng)的工作存谎。

4.顏色混合

顏色混合是將不同的顏色值通過(guò)一些算法拔疚,最終得到一個(gè)顏色值。比如rgba(0.4, 0.5, 0.6, 0.4)和rgba(0.6, 0.1, 0.0, 0.7)進(jìn)行混合既荚,可能得到rgba(0.55, 0.3, 0.2, 0.56)稚失,這個(gè)結(jié)果是隨便寫(xiě)的,僅限方便理解恰聘。通過(guò)顏色混合我們可以實(shí)現(xiàn)不同的濾鏡句各,圖片灰度、馬賽克等晴叨。顏色混合一般發(fā)生在片元著色器中凿宾。

5.深度測(cè)試

深度測(cè)試用一句容易理解的說(shuō)話來(lái)概述,它就是3D空間坐標(biāo)(x,y,z)中的z值篙螟。屏幕是二維的菌湃,如何渲染3D圖形问拘,使那些圖形看起來(lái)像3D遍略,就需要開(kāi)啟深度測(cè)試,這樣OpenGL通過(guò)投影算法骤坐,將z值參與計(jì)算绪杏,才能達(dá)到3D的效果∨ι埽總的來(lái)說(shuō)蕾久,深度測(cè)試就是讓圖形每個(gè)點(diǎn)坐標(biāo)(x,y,z)中的z有意義,否則不管設(shè)置z是多少拌夏,它都會(huì)被當(dāng)做0處理僧著。

三履因、管線渲染流程

管線,初次見(jiàn)到這個(gè)名詞其實(shí)是很難理解的盹愚,但是我們用另一個(gè)大家都熟悉的詞來(lái)描述栅迄,流水線。對(duì)皆怕,管線就像流水線一樣毅舆,每一步都已經(jīng)設(shè)計(jì)好了,GPU按照固定的流程去渲染圖形愈腾。有些工廠流水線上全是機(jī)器操作不需要人為干預(yù)憋活,這種叫固定管線;還有一些部分流程可以讓人去干預(yù)虱黄,這種叫可編程管線悦即。OpenGL中的可編程管線就是頂點(diǎn)著色器和片元著色器。我們來(lái)看一看管線的渲染流程橱乱,從頂點(diǎn)著色器到片元著色器盐欺,如圖1所示。


圖1

以一個(gè)三角形為例仅醇,從可編程管線的流程出發(fā)冗美,一起看看我們能做的是什么。

畫(huà)一個(gè)三角形需要傳入三角形的三個(gè)頂點(diǎn)析二,傳給頂點(diǎn)著色器之后粉洼,頂點(diǎn)著色器是可編程的,所以這里我們可以對(duì)其進(jìn)行操作叶摄。比如圖片翻轉(zhuǎn)中属韧,改變頂點(diǎn)和紋理坐標(biāo)的對(duì)應(yīng)關(guān)系可實(shí)現(xiàn)圖片翻轉(zhuǎn)。

頂點(diǎn)著色器到片元著色器中間的過(guò)程我們是無(wú)法改變的蛤吓,他們是固定管線宵喂,到了片元著色器也是可編程的。在片元著色器中会傲,需要計(jì)算每個(gè)片元對(duì)應(yīng)的顏色锅棕,這時(shí)片元著色器會(huì)從頂點(diǎn)的顏色值去取,或者從紋理中取淌山。這一步也是可以編程的裸燎,在這一步我們可以實(shí)現(xiàn)不同的濾鏡效果,上面已經(jīng)說(shuō)過(guò)很多次了泼疑。

總結(jié)

這一篇文章主要是簡(jiǎn)單介紹了OpenGL相關(guān)的知識(shí)德绿,以及講述了濾鏡實(shí)現(xiàn)的可行性。后續(xù)開(kāi)始OpenGL的圖元繪制,從下一篇文章開(kāi)始將加入繪制的部分代碼移稳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕴纳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子个粱,更是在濱河造成了極大的恐慌袱蚓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件几蜻,死亡現(xiàn)場(chǎng)離奇詭異喇潘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梭稚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)颖低,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弧烤,你說(shuō)我怎么就攤上這事忱屑。” “怎么了暇昂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵莺戒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我急波,道長(zhǎng)从铲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任澄暮,我火速辦了婚禮名段,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泣懊。我一直安慰自己伸辟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布馍刮。 她就那樣靜靜地躺著信夫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卡啰。 梳的紋絲不亂的頭發(fā)上静稻,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音碎乃,去河邊找鬼姊扔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梅誓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梗掰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嵌言!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起及穗,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摧茴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后埂陆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苛白,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年焚虱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了购裙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹃栽,死狀恐怖躏率,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情民鼓,我是刑警寧澤薇芝,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站丰嘉,受9級(jí)特大地震影響夯到,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饮亏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一黄娘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧克滴,春花似錦逼争、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至着帽,卻和暖如春杂伟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仍翰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赫粥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人予借。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓越平,卻偏偏與公主長(zhǎng)得像频蛔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秦叛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容