OpenGL學習筆記(3) 光照

2021-06-03 21:48:00 字數 1508 閱讀 1385

opengl通過定義光源、材料和光照模型屬性來渲染光照物體,其中gl_ambient、gl_diffuse、gl_specular屬性是光源和材料都有的,用gllight*()可以分別設定光的環境強度、散射強度、鏡面強度,用glmaterial*()可以分別設定環境的相對應的各個屬性,具體的解釋參見opengl入門學習第七課或者opengl程式設計指南第五章。除此之外,光源還可以通過gl_position屬性設定光源所在的位置,通過gl_spot_direction(有三個值,表示乙個向量,即光源發射的方向)、gl_spot_exponent(gl_spot_exponent屬性只有乙個值,表示聚光的程度,為零時表示光照範圍內向各方向發射的光線強度相同,為正數時表示光照向**集中,正對發射方向的位置受到更多光照,其它位置受到較少光照。數值越大,聚光效果就越明顯。)、gl_spot_cutoff(gl_spot_cutoff屬性也只有乙個值,表示乙個角度,它是光源發射光線所覆蓋角度的一半,其取值範圍在0到90之間,也可以取180這個特殊值。取值為180時表示光源發射光線覆蓋360度,即不使用聚光燈,向全周圍發射)這三個屬性設定聚光燈。

gl_position屬性。表示光源所在的位置。由四個值(x, y, z, w)表示。如果第四個值w為零,則表示該光源位於無限遠處,前三個值表示了它所在的方向。這種光源稱為方向性光源,通常,太陽可以近似的被認為是方向性光源。如果第四個值w不為零,則x/w, y/w, z/w表示了光源的位置。這種光源稱為位置性光源。對於位置性光源,設定其位置與設定多邊形頂點的方式相似,各種矩陣變換函式例如:gltranslate*、glrotate*等在這裡也同樣有效。方向性光源在計算時比位置性光源快了不少,因此,在視覺效果允許的情況下,應該盡可能的使用方向性光源。

通過呼叫gllightfv(gl_lighti, gl_position, position)所設定的光源位置就是觀察點與照明源的x、y和z的距離。在檢視變換之前設定光源位置,就會以相同的方式同時影響光源和觀察點。

材料還有gl_shininess(鏡面指數)、gl_emission(材料的發射顏色)等屬性。

光照模型通過函式gllightmodel*來進行設定。該函式有兩個引數,第乙個表示要設定的專案,第二個引數表示要設定成的值。

gl_light_model_ambient表示全域性環境光線強度,由四個值組成。

gl_light_model_local_viewer表示是否在近處**,若是則設定為gl_true,否則(即在無限遠處**)設定為gl_false。

gl_light_model_two_side表示是否執行雙面光照計算。如果設定為gl_true,則opengl不僅將根據法線向量計算正面的光照,也會將法線向量反轉並計算背面的光照。

gl_light_model_color_control表示顏色計算方式。如果設定為gl_single_color,表示按通常順序操作,先計算光照,再計算紋理。如果設定為gl_separate_specular_color,表示將gl_specular屬性分離出來,先計算光照的其它部分,待紋理操作完成後再計算gl_specular。後者通常可以使畫面效果更為逼真(當然,如果本身就沒有執行任何紋理操作,這樣的分離就沒有任何意義)。

OPENGL學習筆記 光照

1 隱藏表面消除 隱藏表面消除就是消除實心物體被其他物體所遮擋住的部分,最簡單的方法就是使用深度緩衝區。深度緩衝區的原理是把乙個距離觀察平面 通常是近側裁剪平面 的深度值與視窗中的每乙個畫素相關聯。首先使用glclear 函式,把所有畫素的深度值設定為最大可能的距離,然後在場景中以任意順序繪製所有的...

OpenGL學習筆記《八》光照

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

OpenGL學習10 OpenGL光照

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