學(xué)習(xí)OpenGL ES 2.0需要知道OpenGL ES 2.0相關(guān)的一些概念及知識端考。
在上段中提到了OpenGL ES 2.0相對1.x全新的兩個重要東西——頂點著色器和片元著色器只洒。
頂點著色器
著色器(Shader)是在GPU上運(yùn)行的小程序匀泊。從名稱可以看出丽啡,可通過處理它們來處理頂點。此程序使用OpenGL ES SL語言來編寫赌莺。它是一個描述頂點或像素特性的簡單程序泰讽。
對于發(fā)送給GPU的每一個頂點,都要執(zhí)行一次頂點著色器薪贫。其功能是把每個頂點在虛擬空間中的三維坐標(biāo)變換為可以在屏幕上顯示的二維坐標(biāo)恍箭,并帶有用于z-buffer的深度信息。頂點著色器可以操作的屬性有:位置瞧省、顏色扯夭、紋理坐標(biāo),但是不能創(chuàng)建新的頂點鞍匾。
頂點著色器的輸入輸出模型如下:
片元著色器
片元著色器計算每個像素的顏色和其它屬性交洗。它通過應(yīng)用光照值、凹凸貼圖橡淑,陰影构拳,鏡面高光,半透明等處理來計算像素的顏色并輸出梁棠。它也可改變像素的深度(z-buffering)或在多個渲染目標(biāo)被激活的狀態(tài)下輸出多種顏色置森。一個片元著色器不能產(chǎn)生復(fù)雜的效果,因為它只在一個像素上進(jìn)行操作符糊,而不知道場景的幾何形狀暇藏。
片元著色器的輸入輸出模型如下:
著色器語言
著色器語言(Shading Language)是一種高級的圖形編程語言,僅適合于GPU編程濒蒋,其源自應(yīng)用廣泛的C語言盐碱。對于頂點著色器和片元著色器的開發(fā)都需要用到著色器語言進(jìn)行開發(fā)把兔。它是面向過程的而非面向?qū)ο蟆?br> 關(guān)于著色器語言中的變量、語法在以后使用過程中會提及瓮顽。想要系統(tǒng)的學(xué)習(xí)著色器語言县好,請查閱其他相關(guān)博文和書籍。
坐標(biāo)系
OpenGL ES采用的是右手坐標(biāo)暖混,選取屏幕中心為原點缕贡,從原點到屏幕邊緣默認(rèn)長度為1,也就是說默認(rèn)情況下拣播,從原點到(1,0,0)的距離和到(0,1,0)的距離在屏幕上展示的并不相同晾咪。即向右為X正軸方向,向左為X負(fù)軸方向贮配,向上為Y軸正軸方向谍倦,向下為Y軸負(fù)軸方向,屏幕面垂直向上為Z軸正軸方向泪勒,垂直向下為Z軸負(fù)軸方向昼蛀。
圖形的繪制
前面提到OpenGL ES2.0的世界里面只有點、線圆存、三角形叼旋,其它更為復(fù)雜的幾何形狀都是由三角形構(gòu)成的。包括正方形沦辙、圓形夫植、正方體、球體等油讯。但是其他更為復(fù)雜的物體偷崩,我們不可能都自己去用三角形構(gòu)建,這個時候就需要通過加載利用其他軟件(比如3DMax)構(gòu)建的3D模型撞羽。
投影
OpenGL ES 的世界是3D的阐斜,但是手機(jī)屏幕能夠給我展示的終究是一個平面,只不過是在繪制的過程中利用色彩和線條讓畫面呈現(xiàn)出3D的效果诀紊。OpenGL ES將這種從3D到2D的轉(zhuǎn)換過程利用投影的方式使計算相對使用者來說變得簡單可設(shè)置谒出。
OpenGL ES中有兩種投影方式:正交投影和透視投影。正交投影邻奠,物體不會隨距離觀測點的位置而大小發(fā)生變化笤喳。而透視投影,距離觀測點越遠(yuǎn)碌宴,物體越小杀狡,距離觀測點越近,物體越大贰镣。
光照
如果利用直接給出顏色的方式來對3D場景中的物體進(jìn)行著色渲染呜象,很難使3D場景擁有較強(qiáng)的真實感膳凝。一般來說,曲面物體比平面物體更能體現(xiàn)出光照效果恭陡。想用數(shù)學(xué)模型完全模擬真實世界的光照情況是很難的蹬音,而OpenGL ES 2.0采用的光照模型相對真實世界的光照是進(jìn)行了很大的簡化。在OpenGL ES 2.0中休玩,光照由三種元素組成(也可以說是三種通道組成)著淆,分別為環(huán)境光、鏡面光及散射光拴疤。
- 環(huán)境光是指從四面八方照射到物體上永部,其具體公式為:
- 散射光是指現(xiàn)實世界中組草的物體表面被光照射時,反射光在各個方向基本均勻的情況呐矾,其具體公式為:
實際開發(fā)中往往分兩步計算:
-
鏡面光是指現(xiàn)實世界中光滑的表面被照射時會有方向很集中的反射光苔埋,與散射光最終強(qiáng)度依賴于入射光與被照射點的法向量夾角不同,鏡面光的強(qiáng)度還依賴于觀察者的位置凫佛,具體公式如下:
實際開發(fā)中也是往往分兩步計算:
紋理映射
現(xiàn)實世界中的物體往往是絢麗多彩的讲坎,要模擬現(xiàn)實世界的絢麗多彩孕惜,繪制出更加真實愧薛、酷炫的3D物體,就需要用到紋理映射了衫画。紋理映射是將2D的紋理映射到3D場景中的立體物體上毫炉。
其它
其它更多的諸如3D模型加載、貼圖削罩、陰影瞄勾、粒子、混合與霧弥激、標(biāo)志板进陡、天空盒和與天空穹等知識后續(xù)學(xué)習(xí)使用時再詳細(xì)介紹。