當前位置:
首頁 > 最新 > osg例子解析-osgsimpleshaders

osg例子解析-osgsimpleshaders

在osgsimpleshaders例子中,實現了一個大小動態變化的立方體,同時立方體表面的紋理也會按照一定規則變化。本文將對其中的頂點著色器和片元著色器進行解讀,並介紹一種簡單的光照模型——漫反射光照模型。


主要內容

頂點著色器

漫反射光照模型

片元著色器

實現效果


頂點著色器主要的目的為計算得到頂點位置gl_Position、每一頂點的光照強度LightIntensity、每個片元相對於立方體的相對位置BlockPosition。頂點著色器代碼如下:

其中,一致變數Sine用於接收外部的回調,根據模擬時間呈正弦變化;LightPosition表示光源位置;BlockScale是每個片元紋理的默認大小;易變變數LightIntensity是為每個片元計算的光強;易變變數BlockPosition是每個片元相對於立方體的相對位置,在xz平面中。關於光強的計算會在下一節展開討論。相比於一般只做模型視圖投影變換的頂點著色器而言,這個頂點著色器對gl_Vertex的齊次變數做了一點小的變化,達到按一定比例縮放的效果。


光照模型的簡易示意如下圖所示。

其中tnorm表示某個頂點的法線方向,頂點著色器中lightVec向量表示頂點指向光源位置的向量,由於所有向量都做了歸一化處理,最後光強的值即為法線和光源方向兩個向量夾角的餘弦值。至於為何通過max函數實現,解釋如下:當光線方向矢量與表面法向量重合,此時光反射最強,隨著兩個向量的角度增加到90度,漫反射降低到0,若角度超過90度後,那麼漫反射應該為0,即光線在對象後面,沒有反射,因此使用max函數實現。


本例中的片元著色器實現了變化的類似經典磚塊(黑白相間)著色器的效果,代碼實現如下:

其中ss和tt分別表示當前片元的橫、縱坐標分量。以下代碼段的含義為相鄰行的方塊橫向偏移0.5。blockFract表示每塊方塊的長和寬,在本例中是隨著Sine變化的。

以下代碼塊表示相鄰方塊分別是黑白著色。


本例的實現效果如下圖。

GIF


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 OpenSceneGraph菜鳥 的精彩文章:

TAG:OpenSceneGraph菜鳥 |