OPENGL學習筆記 光照

2021-07-04 23:12:23 字數 2340 閱讀 8938

1、隱藏表面消除

隱藏表面消除就是消除實心物體被其他物體所遮擋住的部分,最簡單的方法就是使用深度緩衝區。

深度緩衝區的原理是把乙個距離觀察平面(通常是近側裁剪平面)的深度值與視窗中的每乙個畫素相關聯。首先使用glclear()函式,把所有畫素的深度值設定為最大可能的距離,然後在場景中以任意順序繪製所有的物體。

深度緩衝區測試可能會影響應用程式的效能,隱藏表面消除丟棄了一些資訊,而不是將它們用來繪圖,因此會稍稍提高效能,但是深度緩衝區會大大影響效能,用「軟體」實現的深度緩衝區(用處理器記憶體實現)要比專用的硬體緩衝區要慢的多。

2、opengl光照

在opengl的光照模型中,只有當存在能夠吸引和反射光線的表面時,光源才會產生效果。opengl假設每個表面時由一種具有某些屬性的材料組成。

(1)材料顏色

和光一樣,材料也具有不同的環境、散射和鏡面顏色,它們決定了材料對紅、綠和藍光的反射率。材料的反射屬性與每種入射光的環境光成分組合,散射反射屬性與入射光的散射成分組合,鏡面反射屬性與入射光的鏡面成分組合。環境和散射屬性定義了材料的顏色,它們一般很相似,卻不相同。鏡面反射屬性通常是白色或灰色的,因此鏡面亮點的顏色也就是光源的鏡面光的顏色。

(2)光和材料的rgb值

如果乙個opengl光線的成分是(lr, lg, lb),一種材料具有相應的成分(mr, mg, mb),那麼反射進入眼睛的光就是(lr*mr, lg*mg, lb*mb)。類似的,如果兩束光進入眼睛,把它們的成分疊加在一起做擷取即可,(r1+r2, g1+g2, b1+b2)。

3、樣例

void init(void)

; glfloat mat_shininess = ;

glfloat light_position = ;

glfloat white_light = ;

glfloat lmodel_ambient = ;

glclearcolor(0.0, 0.0, 0.0, 0.0);

glshademodel(gl_smooth);

glmaterialfv(gl_front, gl_specular, mat_specular);

glmaterialfv(gl_front, gl_shininess, mat_shininess);

gllightfv(gl_light0, gl_position, light_position);

gllightfv(gl_light0, gl_diffuse, white_light);

gllightfv(gl_light0, gl_specular, white_light);

gllightmodelfv(gl_light_model_ambient, lmodel_ambient);

glenable(gl_lighting);

glenable(gl_light0);

glenable(gl_depth_test);

}void display(void)

void reshape(int w, int h)

int main(int argc, char** argv)

建立光源在啟用混合之前,這些顏色中的alpha成分是不會生效的,所以可以安全地忽略alpha值。

這段**把(x, y, z, w)的向量提供給gl_position引數。如果最後乙個值(w)為0.0,表示對應的光源是方向性光源,(x, y, z)值描述了它的方向,這個位置通過模型檢視矩陣進行變換,並以視覺座標的形式進行儲存。預設情況下,gl_position是(0, 0, 1, 0),它定義了乙個指向z軸負方向的方向性光源。如果w是非零值,對應的光源就是位置性光源,預設情況下,位置性光源向所有的方向發射光線,但可以通過把光源定義為聚光燈,把它限制在乙個錐體裡。

opengl把光源的強度乘以衰減因子,對它實行衰減。環境光、散射光和鏡面光的強度都進行了衰減,只有發射光和全域性環境光的強度沒有衰減。另外,由於衰減需要在每次經過計算產生的顏色上再進行一次除法,可能會影響應用程式的效能。

聚光燈多光源

控制光源的位置和方向

選擇光照模型

opengl的光照模型包括下面4個部分:

* 全域性環境光強度

* 觀察點的位置是位於場景還是位於無限遠處;

* 物體的正面和背面是否應該執行不同的光照計算;

* 鏡面顏色是否應該從環境和散射顏色中分離出來,並在紋理操作之後再應用。

定義材料屬性不管我們向其他引數提供的alpha值是什麼,所有頂點的alpha值都是材料的散射顏色的alpha值,也就是在glmaterial*()函式中提供給gl_diffuse的alpha值。

OpenGL學習筆記(3) 光照

opengl通過定義光源 材料和光照模型屬性來渲染光照物體,其中gl ambient gl diffuse gl specular屬性是光源和材料都有的,用gllight 可以分別設定光的環境強度 散射強度 鏡面強度,用glmaterial 可以分別設定環境的相對應的各個屬性,具體的解釋參見open...

OpenGL學習筆記《八》光照

在理解opengl中的光照之前,先理解一下顏色。在我們現實生活中,我們看到的物體顏色,是物體反射的顏色,即沒有被物體吸收掉的部分。opengl利用這個,在系統中模擬的顏色,就是定義乙個表示物件的顏色向量a,再頂乙個乙個表示光源的顏色向量b,然後在片段著色器中將兩個向量相乘得到表示物體的顏色。因此大致...

OpenGL學習10 OpenGL光照

在opengl模型中,除非乙個物體自己會發光,否則它將受到3中不同的光照射 環境光 ambient 散射光 diffuse 和鏡面光 specular 現實世界中,當然不存在這樣的光,但是,作為光抽象,這三種型別的光允許我們模擬和控制光照在物體表面上所產生的主要型別的效果。1 環境光 環境光並不是來...