1. 光的成分
(1)環境光:經過了充分散射,無法分辨其方向
(2)散射光:來自于某個方向,撞擊表面時,均勻的向所有方向發散
(3)鏡面光:來自于一個特定的方向,從特定方向反射,具有光澤的金屬或塑膠具有非常高的鏡面成分
(4)發射光:模拟那些源自某個物體的光
Opengl的光照模型根據所反射的紅藍綠光的比例來模拟顔色。
對于光線而言,顔色成分的數量對應于某種顔色的完全強度的百分比,對于材料而言,它的RGB值和它對于這些顔色的反射比例相對應。
如對于光線,RGB都等于0.5,這種光線應該是灰色的。對于材料,若R=1,G=0.5,B=0,則表示反射所有入社紅光,一半綠光,不反射藍光。
2. 建立光源
(1)顔色
GLfloat light_ambient[] = { 0.0, 0.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLgihtfv(GL_LIGHT0,GL_DIFFUSE,lgiht_diffuse);
...
(2)位置
光源根據其位置分為兩類,第一類是方向性光源,光線到達表面時,所有的光線都是平行的;第二類是位置性光源,在場景中的位置決定了它對于場景的效果
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLgihtfv(GL_LIGHT0, GL_POSITION, light_position);
light_position的4個值(x,y,z,w),若w為0.0, 則為方向性光源;若w為非0,則為位置性光源
對于位置性光源來說,存在着衰減因子。
(3)聚光燈
我們可以對位置性光源的形狀加以限制,使它的發射範圍限于一個錐體之内,就像聚光燈一樣。
需要設定光錐的角度,聚光燈的方向,光錐的軸
光的強度在光錐的中心達到最高,靠近光錐的邊緣,光的強度越弱
(4)多光源
我們至少可以指定8個光源
3. 材料屬性
(1)散射和環境反射
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff);
環境顔色影響物體的整體顔色,物體被直接照亮時,散射顔色占據主要地位
(2)鏡面反射
GLfloat mat_specular[] = {};
GLfloat low_shininess[] = { 50.0 };
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);
GL_SHINESS的值越大,亮點越小,更亮。
(3)發射光顔色
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
(4)顔色材料模式
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glColor3f(0.2, 0.5, 0.8 );
glDisable(GL_COLOR_MATERIAL);
4. 光照模型
(1)全局環境光
GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
(2)局部觀察點或無限遠的觀察點
(3)雙面光照
glLightModeli(GL_LIGHT_MODEL_TWO_SIZE, GL_TRUE);
會反轉背面的法線方向。
(4)鏡面輔助顔色
完整的光照計算公式:
頂點顔色 = emission(material) + ambient(light model) * ambient(material) +
衰減因子 * [ ambient(light) * ambient( material) +
(L*n) * diffuse(light) * diffuse( material) +
pow( (s*n), shininess ) * specular(light) * specular( material) ]