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