天天看點

《Unity着色器和螢幕特效開發秘笈》—— 3.4 建立BlinnPhong高光類型

本節書摘來自華章出版社《unity着色器和螢幕特效開發秘笈》一 書中的第3章,第3.4節,作者:(美)kenny lammers,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

blinn是另一種計算和估算鏡面高光更有效的方式。它是通過視線方向和光線方向所形成的半角向量來完成的。它是由一位名叫吉姆·博林(jim blinn)的人帶進cg世界的。他發現使用半角向量而不是我們自己形成的反射向量來進行計算顯得更加高效。這樣既減少了代碼量也減少了運算時間。如果你看過unitycg.cginc檔案中内置的blinnphong光照模型,你就會發現,它使用的正是半角矢量,這也正是它被命名為blinnphong的原因。它隻是一個完整phong計算的簡單版本。

1.這一次,我們隻使用現存的場景和對象,并不需要建立一個全新的場景。建立一個新的着色器和材質并将它們都命名為blinnphong。

2.建立一個着色器之後,輕按兩下它,啟動monodevelop代碼編輯視窗,這樣我們就可以開始編寫着色器了。

1.添加我們的自定義屬性到properties塊中,這樣我們就可以控制高光的顯示效果了。

《Unity着色器和螢幕特效開發秘笈》—— 3.4 建立BlinnPhong高光類型

2.然後,我們需要確定在cgprogram塊中添加了相應的變量,這樣我們才能在subshader内部通路properties塊中的屬性變量。

《Unity着色器和螢幕特效開發秘笈》—— 3.4 建立BlinnPhong高光類型

3.現在,建立自定義光照模型,用于處理diffuse和specular運算。

《Unity着色器和螢幕特效開發秘笈》—— 3.4 建立BlinnPhong高光類型

4.為了完成我們的着色器,還需要告訴cgprogram塊使用我們自定義的光照模型而不是内置的光照模型,修改#pragma語句如下:

《Unity着色器和螢幕特效開發秘笈》—— 3.4 建立BlinnPhong高光類型

blinnphong高光模型與phong高光模型幾乎是相同的,除了前者因為采用更少的代碼且更高效之外,它們的效果幾乎是一樣的。你會發現如今着色器十有八九都會使用這種方法,因為着色器在使用這種高光模型進行表現時隻需要更加簡潔的代碼和光照運算。

我們簡單地通過視線方向和入射光線方向的角平分線向量來基礎地模拟反射向量,而不是直接計算我們的反射向量。這種方法已經被證明比上一種方法在實體計算方面具有更高的精确度,但我們覺得還是有必要展示一下它的真實意義。

為了得到半角向量,我們簡單地将視線方向和入射光線的方向添加在一起,如下代碼片段所示:

《Unity着色器和螢幕特效開發秘笈》—— 3.4 建立BlinnPhong高光類型

然後,我們再簡單地對頂點法線和新的半角向量進行點積運算進而得到我們的主高光值。完成這些步驟以後,我們對它進行_specpower次方求幂後再乘以高光顔色值變量_specularcolor。blinnphong高光模型的代碼更加簡潔而且數學運算更加簡單,但是依然能夠在實時渲染方面給我們非常漂亮的高光表現。

繼續閱讀