天天看點

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

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

phong高光模型是最基礎且表現最友好的高光類型。它會計算出光在物體表面的反射方向與觀察者視線方向之間的對比結果。它是一種非常常見的高光模型,從遊戲到電影都有諸多的應用。雖然在鏡面反射的精确模組化上它并不是最接近現實的,但在大多數情況下它都顯得極為逼真。另外,如果你的觀察對象是遠離相機的而且不需要對高光進行精确計算的時候,phong高光模型是表現着色器高光效果最好的方式之一。

在本節中,我們将要學習的内容包括如何對phong高光類型進行逐頂點操作,以及在表面着色器中使用input結構體的新參數進行逐像素操作。我們還會看一看它們之間的差别,并探讨兩種不同實作方式的使用條件以及原因。

1.建立一個新的着色器、材質和物體對象,并對它們進行适當命名以友善找到它們。

2.最後,将着色器附加到材質上,然後将該材質賦給建立的物體對象。建好場景後,再建立一個方向光,這樣才能看出我們編寫的高光效果。

1.閱讀至此,你可能已經發現了一個模式,我們似乎總是喜歡從基礎的部分開始編寫着色器。現在,我們将如下所示的屬性添加到着色器中:

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

2.然後我們需要確定位于subshader塊中的cgprogram塊中添加了相應的屬性

變量。

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

3.現在,我們需要添加自定義的光照模型,以便計算phong高光。将下面的代碼添加至着色器的subshader()函數中。現在先不要關心這些内容的意義,因為我們将在下一節中逐行地解釋每一句代碼:

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

4.最後,我們還應該告訴cgprogram塊,它需要使用我們自定義的光照函數而不是内置的函數。為了做到這些,我們對#pragma語句進行如下修改:

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

我們隻将光照函數本身進行分解,因為對于着色器的其餘部分你應該相當熟悉了。

我們簡單地從使用光照函數為我們提供的一個視點方向開始。希望大家記住,unity已經為我們提供了一系列可以使用的光照函數,但是為了正确地使用它們,你還必須使用相對應的正确參數。

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

在這裡,我們正在建立的是一個高光着色器,是以我們需要選擇的是視點相關型的光照函數結構。是以,我們用如下代碼編寫該函數:

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

這樣就會告訴着色器我們想要建立的是一個自定義的視點相關型着色器。當然,你還要確定光照函數的命名與#pragma語句的聲明相一緻,否則unity無法識别你的光照模型。

接下來,光照函數會首先計算頂點法線和光的入射方向或矢量的點積值來聲明一個常用的漫反射元件。我們将得到一個傳回值,當該值為1時,表明物體是正對着光源方向的,反之該值為-1時表明物體是背對着光源方向的。

然後我們計算反射向量,先對頂點法線的向量值進行縮放,将該值乘以2.0後再乘以diff值,得到的值減去光照的方向向量值。這樣做的原因是為了實作法線朝向光源彎曲的效果,是以作為一個遠離光源的法線向量,它将被強制朝向光源方向。為了得到更直覺的視覺表現可以參考下圖。産生這種效果的調試腳本放在本書的支援頁面www.packtpub.com/support上。

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

接下來,我們需要做的就是建立spec值和顔色值。為了得到這兩個值,我們對反射向量和視角方向進行點積運算,然後對結果求_specpower次方,最後将_specularcolor. rgb值乘以spec值得到我們最後的高光。

下圖展示的是我們在着色器中進行單一的phong高光計算的最終結果:

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

繼續閱讀