????????學(xué)習(xí)OpenglES大概一個(gè)月的時(shí)間了,現(xiàn)在回頭復(fù)習(xí)下迅腔,順便寫(xiě)點(diǎn)東西整理下知識(shí)霜浴。剛開(kāi)始學(xué)的時(shí)候一頭霧水,磕磕絆絆將就學(xué)下來(lái)恭应,學(xué)OpenglES最重要的就是對(duì)概念和流程的理解了抄邀,要是直接拿代碼去學(xué),根本啥都看不懂昼榛。對(duì)于第二遍的學(xué)習(xí)境肾,記錄下自己的理解,方便大家交流和自己理解胆屿。
簡(jiǎn)介
????????簡(jiǎn)介這不多寫(xiě)了奥喻,百度好多,簡(jiǎn)單的來(lái)說(shuō)Opengl是一種跨平臺(tái)的編程語(yǔ)言非迹』防穑可以對(duì)圖形硬件設(shè)備訪問(wèn)的軟件庫(kù),顯卡基本都支持Opengl憎兽,可能有些版本的不同冷离。OpenglES是針對(duì)移動(dòng)設(shè)備,手機(jī)游戲機(jī)等。OpenglES可以用于繪制3D圖形,提高渲染效率,圖像的處理黑毅。
CPU和GPU
????????OpenglES主要通過(guò)GPU繪制圖形愿卒,下面是CPU和GPU的架構(gòu)圖易结,綠色的為運(yùn)算單元搞动,黃色為控制單元飞主,紅色是緩存碾篡。
????????CPU和GPU它們分別針對(duì)了兩種不同的應(yīng)用場(chǎng)景穆律。CPU需要很強(qiáng)的通用性來(lái)處理各種不同的數(shù)據(jù)類型峦耘,同時(shí)又要邏輯判斷又會(huì)引入大量的分支跳轉(zhuǎn)和中斷的處理剔蹋。這些都使得CPU的內(nèi)部結(jié)構(gòu)異常復(fù)雜。而GPU面對(duì)的則是類型高度統(tǒng)一的辅髓、相互無(wú)依賴的大規(guī)模數(shù)據(jù)和不需要被打斷的純凈的計(jì)算環(huán)境泣崩。
????????GPU采用了數(shù)量眾多的計(jì)算單元和超長(zhǎng)的流水線,但只有非常簡(jiǎn)單的控制邏輯并省去了Cache洛口。而CPU不僅被Cache占據(jù)了大量空間矫付,而且還有有復(fù)雜的控制邏輯和諸多優(yōu)化電路,相比之下計(jì)算能力只是CPU很小的一部分
opengl的渲染流程
? ? ? ? 這里不具體寫(xiě)OpenglES如何編寫(xiě)第焰,先介紹大體的流程和用處买优,OpenglES目前分為三個(gè)版本,OpenglES1.0(固定管線)挺举,2.0(可編程管線)杀赢,3.0(在2.0的基礎(chǔ)上擴(kuò)展),這里我用的是2.0湘纵。
????????圖形渲染的基本單位就是點(diǎn)葵陵,兩個(gè)點(diǎn)之間用點(diǎn)渲染成線,三個(gè)點(diǎn)之間渲染成面瞻佛,一個(gè)面就是由一個(gè)或多個(gè)三角形組成,3D物體就是由許許多多的三角形拼接而成娇钱。渲染完圖形的框架后伤柄,可以在每個(gè)點(diǎn)上添加顏色,或者加上圖片對(duì)應(yīng)點(diǎn)的顏色文搂,看起來(lái)就是一個(gè)完整的物體了适刀。在繪制時(shí),簡(jiǎn)單的圖形我們可以自己定義煤蹭,復(fù)雜的需要用工具導(dǎo)出數(shù)據(jù)笔喉,這些數(shù)據(jù)包括頂點(diǎn)信息、紋理信息硝皂、法線信息常挚,這里的法線是用來(lái)做光照效果的,就算漫反射也是由無(wú)數(shù)個(gè)鏡面反射組成的稽物,法線就是用來(lái)計(jì)算反射角奄毡,這樣的計(jì)算是由系統(tǒng)來(lái)做的。
????????關(guān)于3D贝或,我們的手機(jī)是一個(gè)平面吼过,所看的3D效果是由數(shù)據(jù)經(jīng)過(guò)一系列的矩陣變換锐秦,投影到平面上展示的。移動(dòng)盗忱、平移酱床、縮放,矩陣的變換是不可缺少的趟佃。
? ? ? ? 圖像頂點(diǎn)數(shù)據(jù)到顯示結(jié)果有幾個(gè)大體的過(guò)程
頂點(diǎn)數(shù)據(jù):buffer是放置數(shù)據(jù)的地方扇谣,老外起的名字
頂點(diǎn)著色器:頂點(diǎn)數(shù)據(jù)傳遞給著色器,著色器通過(guò)glsl對(duì)頂點(diǎn)進(jìn)行編輯
頂點(diǎn)變換:頂點(diǎn)數(shù)據(jù)有時(shí)需要矩陣變換
圖元裝配:頂點(diǎn)信息根據(jù)畫(huà)圖的需要揖闸,將一些點(diǎn)連接起來(lái)
光柵化:連接頂點(diǎn)的線段上用點(diǎn)拼接起來(lái)揍堕,三角形填充也用點(diǎn)
片元著色器:將所有的點(diǎn)通過(guò)片元著色器填充顏色或紋理圖片
運(yùn)用到的一些知識(shí)
? ? ? ? 學(xué)了一個(gè)月感覺(jué)大體的流程還是比較清楚地,像大多數(shù)的程序語(yǔ)言一樣汤纸,語(yǔ)法不是重點(diǎn)衩茸,想要繪制好看的東西,還是要靠自己的思考和勤加練習(xí)贮泞。
? ? ? ? glsl(Opengl shading language?)著色器語(yǔ)言楞慈,在工程里單獨(dú)建立的一個(gè)文件,通過(guò)程序加載到opengl的執(zhí)行程序里啃擦,分頂點(diǎn)著色器和片元著色器囊蓝,可以操作片元的位置和顏色,大多數(shù)情況下都要依靠這兩個(gè)文件令蛉,通過(guò)變量傳遞給著色器聚霜,在里面編寫(xiě)位置的變化,矩陣相稱珠叔,紋理取值等蝎宇。
坐標(biāo)系,物體坐標(biāo)系:起初的坐標(biāo)系和世界坐標(biāo)系是重疊的祷安,物體移動(dòng)后坐標(biāo)系原點(diǎn)也會(huì)跟著移動(dòng)姥芥。
????????????????慣性坐標(biāo)系:物體坐標(biāo)系原點(diǎn)起,坐標(biāo)軸平行于世界坐標(biāo)系汇鞭。
????????????????世界坐標(biāo)系:在空間中建立起的坐標(biāo)系凉唐,默認(rèn)原點(diǎn)在屏幕的正中央,x軸向右霍骄,y向上台囱,z向屏幕外。
????????????????觀察者坐標(biāo)系:原點(diǎn)起腕巡,x軸和y軸和世界坐標(biāo)系一致玄坦,z軸相反(向屏幕里面)。FOV是視角的大小,NEAR PLANE是近平面煎楣,F(xiàn)AR PLANE是遠(yuǎn)平面豺总,物體只有在兩個(gè)平面之間的椎體內(nèi),才能被看見(jiàn)择懂。
向量和矩陣喻喳,在opengl中向量都是列向量(向量的書(shū)寫(xiě)都是從上往下),所以我們會(huì)看到在著色器中會(huì)用矩陣乘以向量困曙,如果反過(guò)來(lái)向量乘以矩陣表伦,是沒(méi)有意義的。在文章中我們看到的向量橫著寫(xiě)慷丽,是為了方便書(shū)寫(xiě)蹦哼。矩陣也是特殊的向量,如果我們把一個(gè)矩陣的每一行看成一個(gè)向量
1要糊,0纲熏,0 ? ? ? ?x軸
0,1锄俄,0 ? ? ? ?y軸
0局劲,0,1 ? ? ? ?z軸?
那么這個(gè)矩陣三個(gè)向量組成的也就是(1奶赠,1鱼填,1),矩陣和向量的相乘其實(shí)也可以看成在每個(gè)軸縮放的倍數(shù)(這只是矩陣為對(duì)角線的)毅戈,如果需要旋轉(zhuǎn)苹丸,會(huì)用到cos和sin,具體的計(jì)算我不寫(xiě)了苇经,腦補(bǔ)下圍繞某個(gè)軸旋轉(zhuǎn)后谈跛,每個(gè)向量的取值和角度的關(guān)系,不太難塑陵。
再說(shuō)一個(gè)四維向量,我們繪制的是3D物體蜡励,只有三個(gè)軸令花,opengl中的四維向量很多,我們上面講到凉倚,三階矩陣和向量相乘兼都,只能旋轉(zhuǎn)縮放,如果移動(dòng)嗯稽寒,這是時(shí)候就需要再加一個(gè)w(x扮碧,y,z,w)慎王,向量的w默認(rèn)為1蚓土,這樣矩陣就可以把移動(dòng)的距離放在第四個(gè)w中,來(lái)舉個(gè)例子赖淤,x軸移動(dòng)1蜀漆,y軸移動(dòng)2,z軸移動(dòng)3咱旱,那么矩陣就是
1确丢,0,0吐限,1?
0鲜侥,1,0诸典,2
0描函,0,1搂赋,3
0赘阀,0,0脑奠,1
向量的叉乘基公,同時(shí)垂直兩個(gè)向量的向量,即c垂直于a宋欺,同時(shí)c垂直于b(a與c的夾角為90°轰豆,b與c的夾角為90°)
c =? a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x*b.z? , a.x*b.y-b.x*a.y)
向量點(diǎn)乘,是一個(gè)向量和它在另一個(gè)向量上的投影的長(zhǎng)度的乘積齿诞;是標(biāo)量酸休。
a?*?b?= |a| * |b| * cosθ?????????????|a|為向量長(zhǎng)度