OpenGL光的顏色由紅綠藍(RGB)的分量確定,當光照到表面時,由表面的材質的確定反射的光的顏色(RGB).
OpenGL光有四類 | 簡介 |
環境光 | 無特定照射方向,太陽光 |
漫射光 | 有照射方向的光,遇表面光將朝反方向照射, 如燈光不受相機位置影響. |
反射光 | 有照射方向,遇表面光將朝反方向照射.如亮光但受相機位置影響. |
放射光 | 只增加物體的亮度 |
OpenGL光照影響因素 | 簡介 |
光源 | 環境光、漫射光、反射光、放射光 |
材質 | 確定反射光RGBA值 |
法線 | 由表面的頂點計算方向 |
相機位置 | 當光折射時, 相機位置影響反射光的計算 |
光的顏色、位置、方向的設定: |
void glLightfv (GLenum light, GLenum pname, const GLfloat *params); |
glLightfv()參數 | 簡介 |
light | GL_LIGHT0~ GL_LIGHT7
OpenGL最多可以指定8個光源 |
pname | 光源的參數名見下表 |
Params | 光源的參數值 |
光源的參數名Pname | 簡介 |
GL_AMBIENT | 環境光向所有方向照射 |
GL_DIFFUSE | 漫射光具有方向,碰撞到FACE會進行反射 |
GL_SPECULAR | 鏡面反射光 |
GL_POSITION | 光的位置 |
GL_SPOT_DIRECTION | 聚光燈的矢量方向 |
GL_SPOT_EXPONENT | 聚光燈的指數 |
GL_SPOT_CUTOFF | 聚光燈的邊界 |
GL_CONSTANT_ATTENUATION | 衰減值係數常量 |
GL_LINEAR_ATTENUATION | 線性衰減值係數 |
GL_QUADRATIC_ATTENUATION | 二次衰減值係數 |
環境光 | 簡介 |
Pname=GL_AMBIENT | 環境光 |
Params=(x,y,z,w) | 顏色分量 |
w=alpha | w=0透明
w=1實體 |
float Light_Ambient[] = { 1.0f,1.0f,1.0f,1.0f};
glLightfv(GL_LIGHT0,GL_AMBIENT, Light_Ambient); |
亮白的環境光示例 |
漫射光 | 簡介 |
GL_DIFFUSE | 漫射光 |
Params=(x,y,z,w) | 顏色分量 |
w=alpha | w=0透明
w=1實體 |
float Light_Diffuse[] = { 1.0f,1.0f,1.0f,1.0f};
glLightfv(GL_LIGHT0,GL_DIFFUSE, Light_Diffuse); |
亮白的漫射光示例 |
光源的位置 | 簡介 |
Pname= GL_POSITION | 設定光源的位置 |
Params=(x,y,z,w) | 向量或坐標 |
w=0 | 定向光源(x,y,z)為向量定義光的照射方向,如太陽. |
W=1 | 定點光源(x,y,z)為坐標定義光源的位置,如燈泡. |
float Light_Position[] = {0.0f,0.0f,0.0f,1.0f };
glLightfv(GL_LIGHT0,GL_POSITION,Light_Position); |
光源的位置設在原點 |
光衰減(OpenGL支持三類光衰減) | 默認值 | 簡介 |
ATTENUATION | 光線隨著距離的增大其強度減小,但只適用於定點光源,但定向光源是無窮遠的設置衰減是無意義.
衰減因子*光強度 = 光衰減 |
|
GL_CONSTANT_ATTENUATION | 1.0f | 衰減值係數常量 |
GL_LINEAR_ATTENUATION | 0.0f | 線性衰減值係數 |
GL_QUADRATIC_ATTENUATION | 0.0f | 二次衰減值係數 |
光照亮度演示程式,定點光源並且全方位輻射.如上圖:下載
- 按+/-鍵增加或減小光照亮度
- 按SPACE(空格)鍵啟用或禁用光照
- 按UP/DOWN鍵正方形繞X軸旋轉
- 按LEFT/RIGHT鍵正方形繞Y軸旋轉
- 按Z+LEFT/Z+RIGHT鍵繞Z軸旋轉
- 按F1鍵打開幫助
- 按ESC鍵重置模型旋轉角度