天天看點

OpenGL-光照模型

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) ]

上一篇: fscanf和fgets