Notes for OpenGL - 4

今天開始在程序裏面添加按鍵響應(Ketboard)以及燈光(light)。

先從燈光開始。燈光分爲兩種,一種叫環境光(這個我的翻譯,原詞是ambient light)。環境光顧名思義是說這並不是從特定的一個方向照射過來的光,在這種光下,我們的圖形將沒有陰影。(這裏錯了,其實環境光不是沒有陰影,如果希望沒有陰影的話,就不需要再“開燈”了。環境光是指所有的物體都將被這個光照射到)

而另一種光叫漫射光(diffuse light),這種就是正常的單方向的光,我們的圖形將只有被照到的面會反射光亮,沒有照射到的地方將會變暗。(這裏也錯了,並不是說只有被照到的菜會反光,只是直接照到的會更加亮一些,而沒有直接照射到的將會比較暗淡)

glLightfv是我們所用的函數。函數原型是

void glLightfv(GLenum light, GLenum pname, const GLfloat *params)

第一個參數是指定一個燈,燈的數量是由執行情況而定的,但是至少能有8個。我們可以用GL_LIGHTx(0 <= x < GL_MAX_LIGHTS)來指定我們所要使用的燈。

第二個參數指定了單值的燈的光源參數,我們可以使用常量GL_AMBIENTGL_DIFFUSEGL_SPECULAR,GL_POSITIONGL_SPOT_DIRECTIONGL_SPOT_EXPONENTGL_SPOT_CUTOFF,GL_CONSTANT_ATTENUATIONGL_LINEAR_ATTENUATIONGL_QUADRATIC_ATTENUATION。

第三個參數是傳入一個關於我們設置的光源參數數組的指針。

光源參數的四個參數其實跟顏色是一樣的,前三個表示RGB,第四個是alpha值。如果參數是(1.0f, 0.0f, 0.0f, 1.0f)的話,說明照射過來的光是紅色的。

然後還要注意的是我們的光是需要一個光源方向的,這個方向還是由glLightfv來確定,只需將第二個參數改成GL_POSITION即可。第三個參數也是參數數組。數組內的前三個參數跟glTranslatef的三個參數一樣,是確定位置的。

我並不確定最後一個參數(這將在以後慢慢補充),現有的測試是,爲1.0的時候光源似乎沒有太過明顯的陰影,而爲0.0的時候,當我把光源遠離物體的時候將會出現非常明顯的陰影。而且這個參數的值越大,陰影越不明顯。

 

注意,在使用光照之前,我們務必要先glEnable(GL_LIGHTx)來允許我們設置的燈可以使用,然後要用glEnable(GL_LIGHTING)來開始光照(一開始我並沒有加入這句話,結果可想而知,大量時間浪費在找原因上面了...糾結...)。

 

最後是關於一些控制的問題了。其實這部分很簡單,在沒有做之前我一直以爲會有些複雜,其實所有對於圖形的控制,只是在更改glTranslatef 裏的角度,當角度修改了以後,更新GL就可以完成我們所希望的改動。消息獲取麼,在QT中直接用mouseMoveEvent、mousePressEvent 還有keyPressEvent 就可以了。

 

 

接下來是關於混合(blending)的幾個函數。混合在我現在的理解下(雖說是“理解”,但是其實我對混合並不是非常熟悉)僅僅是顏色、紋理的透明,alpha參數便是透明度。

打開混合需要glEnable(GL_BLEND)來啓動,然後調用glBlendFunc(GL_SRC_ALPHA,GL_ONE) 來實現我們的透明效果

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