前面繪制球體時 Android OpenGL ES 開發教程(22):繪制一個球體 ,為了能看出3D效果,給場景中添加光源。如果沒有光照,繪出的球看上去和一個二維平面上圓沒什么差別,如下圖,左邊為有光照效果的球體,右邊為同一個球體但沒有設置光源,看上去就沒有立體效果,因此 OpenGL 光照效果對顯示3D效果非常明顯。
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/94.png" alt="" />
在 OpenGL 光照模型中光源和光照效果可以細分為紅,綠,藍三個部分,光源由紅,綠,藍強度來定義,而物體表面材料由其反射紅,綠,藍的程度和方向來定義。OpenGL 光照模型使用的計算公式是對于現實世界光照的一個近似但效果非常好并適合快速計算。
OpenGL 光照模型中定義的光源可以分別控制,打開或關閉,OpenGL ES支持最多八個光源。
OpenGL 光照模型中最終的光照效果可以分為四個組成部分:Emitted(光源), ambient(環境光),diffuse(漫射光)和specular(鏡面反射光),最終結果由這四種光疊加而成。
http://wiki.jikexueyuan.com/project/opengl-es-guide/images/95.png" alt="" />
Emitted : 一般只發光物體或者光源,這種光不受其它光源的影響。
ambient: 指光線經過多次反射后已經無法得知其方向(可以看作來自所有方向),可以成為環境光,該光源如果射到某個平面,其反射方向為所有方向。Ambient 不依賴于光源的方向。
diffuse:當一束平行的入射光線射到粗糙的表面時,因面上凹凸不平,所以入射線雖然互相平行,由于各點的法線方向不一致,造成反射光線向不同的方向無規則地反射,這種反射稱之為“漫反射”或“漫射”。這個反射的光則稱為漫射光。漫射光射到某個平面時,其反射方向也為所有方向。diffuse 只依賴于光源的方向和法線的方向。
specular : 一般指物體被光源直射的高亮區域,也可以成為鏡面反射區,如金屬。specular 依賴于光源的方向,法線的方向和視角的方向。
盡管光源可能只發送某一頻率的光線,但 ambient,diffuse 和 specular 可能不同。比如使用白光照射一堵紅墻,散射的光線可能為紅色。OpenGL 允許為光源分別設置紅,綠,藍三個元素的值。
最終決定所看到物體的顏色除了光源的顏色和方向外,還取決于物體本身的顏色,比如紅色的光照在紅色的物體和藍色的物體,最終看到的物體一個還是紅色,一個為黑色。OpenGL 中對物體材料(Material)的顏色是通過其反射紅,綠,藍的比例來定義的。 和光源一樣,物體的顏色也可以有不同的 ambient,diffuse 和 specular,表現為反射這些光的比例。ambient,diffuse 反射通常為同樣的顏色,而 specular 常常表現為白色或灰色光,如使用白光照射一個紅色的球,球的大部分區域顯示為紅色,而高亮區域為白色。