天天看點

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

每年都有越來越多的太空主題遊戲問世,科幻遊戲的一個重要組成部分是如何在遊戲中內建一些未來科技感。全息技術就是這樣一種非常适用于創造未來科技感覺的着色技術。全息着色有很多不同的表現形式,但是通常都是用來渲染一些半透明的尖銳物體。這一節會告訴你如何建立類似的特效。首先要記住一點:可以通過噪聲、動畫掃描線以及振動來建立一些非常卓越的全息特效。下圖是一個使用全息特效制作的物體的圖像:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

因為全息特效隻會顯示物體的輪廓,是以我們将這個着色器稱為silhouette。将着色器附着到一個材質然後将材質指定給三維模型。

按照下面的步驟,可以将已有的着色器轉換為一個全息着色器:

給着色器添加如下屬性:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

給cgprogram部分添加如下變量:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

因為材質是透明的,是以添加如下标簽:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

 根據所使用的物體類型的不同,你可能想要顯示物體的背面,如果這樣的話需要添加cull off來確定物體的背面不會被移除掉。這個着色器不是用來模拟真實材質的,是以沒有必要使用pbr光照模型。這裡使用朗伯反射(lambertian reflectance),朗伯反射是一種非常廉價的光照模型。此外需要通過設定nolighting來禁用所有光照,還需要通過alpha:fade來告知cg這應該是一個透明着色器:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

修改input結構,讓unity知道在目前視角方向和世界法線方向如何填充input:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

使用下面的表面函數。記住一點:因為這個着色器使用朗伯反射作為其光照函數,是以表面函數的輸出結構應該相應地修改成surfaceoutput而不是surfaceoutputstandard:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》一2.8 建立全息着色器

現在可以使用rim effect滑塊來選擇全息特效的強度了。

前面已經提過,這個着色器隻是渲染物體的輪廓。如果從另外一個角度觀察物體,其輪廓會相應地發生變化。從幾何學的角度來講,模型的邊緣是由那些法線垂直于目前視線方向的三角形構成的。相應地,在input結構中,我們聲明了參數wordnormal和viewdir。

判斷兩個向量是否正交可以通過計算其點積得知。如果兩個向量是正交的,則二者的點積為0。我們使用_dotproduct來判斷點積需要多麼接近于0時才将三角形視為其輪廓。

這個着色器中的第二個方面是模型的邊(完全可見)與_dotproduct确定的角度(不可見)之間的漸變褪色。這是通過下面的線性插值完成的:

最後,紋理中的初始alpha值與新計算的系數相乘來獲得我們想要的全息效果。

這個技術本身非常簡單也相對比較廉價,可以用在大量其他特效上,比如:

科幻遊戲中包裹有某種顔色氣體的星球

某個選中物體或者目前滑鼠下面的物體的輪廓

鬼或者幽靈

引擎中散發出的煙霧

爆炸的沖擊波

太空飛船在遭到攻擊時的泡泡護盾

點積在計算反射的時候起了重要作用,在第3章中會詳細解釋其工作原理以及為何其廣泛應用在很多着色器中。

繼續閱讀