OpenGL中建立聚光燈的效果

來源:互聯網
上載者:User

標籤:opengl   聚光燈   平行光   頂點光照   

OpenGL中建立聚光燈的效果
     現在,我們使用如下的數組來指定一個光源的位置:
     // 指定光源位置的數組      GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f};     // 設定光源0的位置     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
     lightPos數組的最後一個值在此為1.0,它表示光源的實際位置就在(X,Y,Z)所表示的位置。在預設情況下,光線從這個位置均勻地向四周發射。如果我們把lightPos數組的最後一個值設為0.0,可以使光源看上去像是來自無限遠處,並沿著向量(X,Y,Z)所指定的方向射入。這種看似來自無限遠處的光源稱為方向性光源,它會均勻地照射在物體的表面,它的所有光線都是平行的,是一種平行光。反之,對於位置性光源,光線會從光源處向不同方向發散開來。
     接下來,我們通過設定一些參數,來實現聚光燈的效果,代碼如下所示:
     // 指定光源的位置和光照值
 GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f}; GLfloat ambientLight[] = {0.5f, 0.5f, 0.5f, 1.0f}; GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat specref[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat spotDir[] = {0.0f, 0.0f, -1.0f};
 // 執行情境的初始化設定 void SetupRC() {     ...       // 啟用光照計算      glEnable(GL_LIGHTING);     // 設定微弱的環境光線,使物體可見      glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);     // 設定光源0的散射光和鏡面光成分      glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight);      glLightfv(GL_LIGHT0,GL_SPECULAR,specular);     // 設定光源0的位置      glLightfv(GL_LIGHT0,GL_POSITION,lightPos);     // 設定光源0的聚光燈效果,切角50度      glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,50.0f);     // 啟用光源0      glEnable(GL_LIGHT0);     // 啟用顏色追蹤      glEnable(GL_COLOR_MATERIAL);     // 設定材料屬性      glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);     // 設定鏡面光反射屬性及強鏡面指數      glMaterialfv(GL_FRONT, GL_SPECULAR,specref);      glMateriali(GL_FRONT, GL_SHININESS,128);          ... }
     上述代碼中的GL_SPOT_CUTOFF值指定了從聚光燈發射出來的光錐的發散角度。其中,光線是沿光錐邊緣的中線發散出來的。對於一種常規的位置光源,這個角度為180度;而對於聚光燈,只有0度到90度的值是有效。聚光燈發射一個光錐,這個錐體外面的物體並不會被照射到,:
     

     注意,OpenGL中的光源本身無法被直接看到。聚光燈並沒有建立可見的光錐,平行光也沒有建立平行的光束。為了在OpenGL中建立這些效果,我們必須繪製相關的幾何圖形。
                     單調著色,低表面類比度
                    平滑著色,高表面類比度
     在我們的這個樣本中,增加球體的表面類比度有助於改善光照效果,但是仍然可以看到極為不自然的人為效果,這便是頂點光照的一個缺點。通過對頂點施加光照並對它們進行勻和,我們便得到了一個粗糙的光照近似值。這種頂點光照的方法在許多情況下已經夠用,但是它在有些情況下仍會顯得不夠充分。為了實現最佳的光照效果,必須藉助著色器。這一部分的樣本程式完整代碼已經放到了GitHub上,有需要的朋友可以參考一下(https://github.com/dxm3dp/OpenGL-05-Spot點擊開啟連結),期待更加絢麗自然的效果。

    本文出自杜曉萌的部落格,請勿用於任何商業用途,轉載請保持完整性並標明出處:                   http://blog.csdn.net/haohan_meng

OpenGL中建立聚光燈的效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.