1. 程式人生 > >oepngl學習筆記——讓p(l)y變得cool~(光照)

oepngl學習筆記——讓p(l)y變得cool~(光照)

上一講我們大致講了如何繪製ply。但是這還不夠,你得到的東西看起來就像是一個顏色塊。這是因為這個世界沒有光,我們要加上光照的效果。為此,我們在Init函式裡這樣設定

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

這樣我們開啟了光照功能,並啟動了light0,你可以依葫蘆畫瓢的啟動light1,2,3,4……不過,要注意的是,在opengl管線程式設計,也就是像我們這樣用函式設定各種效果的程式設計下,能啟動的光源是有限的。同時,開啟光源將關閉你的所有關於顏色的定義。

接著我們把光源綁在相機上,這樣方便我們看清楚模型的每一個毛孔。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, l_position);
gluLookAt(b, c, a,
        T_x, T_y, T_z,
        0, 1, 0);

1_position是一個數組,{0,0,0,1},前三個資料代表相機位置,最後一個一般情況下是1,如果想弄面光源(英文說是direction light),就寫0,前三個引數就會變成光源方向。其他的值參考書裡沒講,有興趣的自己查吧。我們在呼叫視點變化函式指定相機狀態之前說明光源位置,光源就會一起做變化,因為這裡放在了(0,0,0),也就是相機初始點,所以之後不管怎麼動,光源都在相機的地方。

同時,我們對於法向量也要設定,這樣opengl才能計算出每個點的“顏色”。這部分程式碼上一節中我也順手提上去了,這裡再水一下。

glNormalPointer(GL_FLOAT, 6 * sizeof(GLfloat), BUFFER_OFFSET(3 * sizeof(GLfloat)));
同時別忘了啟動法向量運算。
glEnableClientState(GL_NORMAL_ARRAY);

這樣,我們就得到了一個將就著看的模型(大部分光照屬性都使用預設值)。


(模型演出:某帥氣學長)

感覺篇幅有點多,我們下一講再談使用者操作並附上完整程式碼。(這只是一次實驗的一道題啊,這麼麻煩的嗎)