OpenGL學習筆記(3)——光照

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。後者通常可以使畫面效果更爲逼真(當然,如果本身就沒有執行任何紋理操作,這樣的分離就沒有任何意義)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章