OpenGL超級寶典筆記(三)


第五章 顏色、材料和光照

學習如何在3D場景中添加顏色以及平滑着色,如何指定一個或多個光源,並根據環境、散射和鏡面成分定義它們的光照特徵。

a) 在OpenGL中使用顏色,通過分別指定紅、綠、藍成分的強度來指定一種特定的顏色。設置繪圖顏色void glColor<x><t>(red , green , blue , alpha);<x>表示參數的數量,<t>表示參數的數據類型。

b) 接着,講講着色,可以簡單地定義爲一種顏色到下一種顏色的平滑過渡(漸變)。glShadeModel(GL_SMOOTH),啓用平滑着色,還有其他模式GL_FLAT,單調着色,即圖元內部不進行着色技術,內部顏色就是最後一個頂點所指定的顏色。但GL_POLYGON圖元,它的內部顏色是第一個頂點的顏色。

c) 現實世界的顏色 在OpenGL光照模型中,除非一個物體自己會發光,否則都會受到3種不同類型的光的照射:環境光(ambient)、散射光(diffuse)和鏡面光(specular)。環境光並不來自任何特定的方向,散射光具有方向性,來自於一個特定的方向,鏡面反射具有很強的方向性,只沿一個特定的方向反射。真實的顏色還有與材料有密切關係,光照和材料一齊影響才顯示人眼看到的顏色。

d) 向場景添加光照 啓動光照glEnble(GL_LIGHTING);設置光照模式GLfloat ambientLight[]={1.0f,1.0f,1.0f,1.0f}; ....glLightModelfv(GL_LIGHT_MODEL_AMBIENT , ambientLight);ambientLightRGBA值;設置材料屬性 GLfloat gray[]={0.75f,0.75f,0.75f,0.75f};.....glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,gray);另一種方法是顏色追蹤,僅僅通過調用glColor來設置材料屬性。代碼如下:glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);...glColor3f(0.75f,0.75f,0.75f);隨着多邊形的數量增加,它的執行速度將會更快。

e) 使用光源 除了強度和顏色之外,這些光源具有位置和方向。法線是很好的充當方向這個角色,使用以下函數可以找一條法線void m3dFindNormal(M3DVector3f  vNormal, const M3DVector3f vP1,const M3DVector3f vP2,const M3DVector3f vP3);設置光源glEnable(GL_LIGHT0);GLfloat lightPos[]={-50.0f,50.0f,100.0f,1.0f};.......glLightfv(GL_LIGHT0,GL_POSITION,lightPos);lightPos[]包含了光的位置,最後一個值是1.0表示指定的座標是光源的位置,當該值爲0.0時則表示光是從無限遠處沿着這個數組所指定的向量照射過來的。

f) 光照效果,OpenGL提供一些有關光照效果函數:鏡面光glLightfv(GL_LIGHT0,GL_SPECULAR,specular);鏡面反射GLfloat specref[]=(1.0f,1.0f,1.0f,1.0f);....glMaterialfv(GL_FROAT,GL_SPECULAR,specref);鏡面指數glMaterial(GL_FRONT,GL_SHININESS,128);GL_SHININESS屬性設置材料的鏡面指數。另外還有法線均衡(normal averaging),它可以產生一些有趣的光學幻覺,可以做一些球體。

g) 有光就離不開陰影,它可以極大的提高場景的真實性以及視覺效果。用到math3d函數庫的m3dMakePlanarShadowMatrix函數,它接受的參數包括我們希望陰影所出現的平面的平面方程和光源位置,它返回這個函數所創建的一個變換矩陣。

發佈了140 篇原創文章 · 獲贊 10 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章