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
TAG:OpenSceneGraph菜鳥 |