天天看點

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

本節書摘來自華章計算機《unity着色器和螢幕特效開發秘笈(原書第2版)》一書中的第2章,第2.10節,作者 [英]艾倫朱科尼(alan zucconi)[美]肯尼斯拉默斯(kenneth lammers),譯 占紅來,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

很多即時戰略遊戲需要通過在某個標明機關周圍繪制圓環來顯示一些距離(比如攻擊範圍、移動距離、視野範圍等)。如果地形是平整的,可能隻需要在四邊形上畫一個圓形紋理就可以了。但是如果地形不是平的,則四邊形可能會被一些小山或者其他幾何體給截斷。這一節中你會學到如何在複雜地形上使用着色器畫圓環。如果還想移動這個圓環,就需要一個着色器和一些c#腳本。下圖是一個在由一堆小山構成的地形上畫出圓環的例子:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

這個技術并不需要對場景中的每一個幾何體進行操作,而是針對地形進行操作。是以第一步需要在unity中準備一個地形。

首先建立一個名為radiusshader的着色器和一個名為radius的材質。

準備一個角色,我們會在這個角色周圍畫出一個圓。

從菜單中選擇 gameobject | 3d object | terrain來建立一個新地形。

給地形建立一定的幾何結構。可以導入一個已有的結構或者使用工具來建立一個新的(raise/lower terrain, paint height, smooth height)。

在unity中,地形是一類特殊的對象,地形上的紋理映射也和傳統的三維模型上的紋理映射有所不同。不能通過着色器提供一個_maintex紋理,因為地形需要自己提供紋理。步驟是選擇paint texture,然後單擊add texture...。

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

現在紋理已經設定好了,你可以修改地形的材質,通過這個材質就可以應用我們的自定義着色器。從terrain settings中修改material屬性為custom,然後将radius材質拖曳到custom material欄。

現在你就可以開始建立着色器了。

首先編輯radiusshader檔案。

在新的着色器中添加如下四個屬性:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

在cgprogram部分添加相應的變量:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

表面函數的input結構不僅需要紋理的uv值,還需要地形上每個點的位置(在世界坐标下)資訊。可以通過修改input結構來獲得這個參數:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

最後使用這個表面函數:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

以上這些就是在地形上畫圓環所需要的所有步驟。你可以使用材質的inspector标簽頁來修改圓環的位置、半徑和顔色。

如果想要圓環跟着角色走,還需要其他一些必要的步驟:

建立一個新的名為radius的c#腳本。

給該腳本添加如下屬性:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

在update()方法中,添加下面幾行代碼:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.10 在地形周圍建立圓環

将腳本添加到角色上。

最後将radius材質拖曳到腳本的radius material欄。

現在可以把你的角色到處移動一下,這個腳本始終會在你的角色周圍建立一個漂亮的圓環。修改radius腳本的屬性也會改變圓環的半徑。

繪制圓環需要的元素有圓心、半徑和顔色。在着色器中可以通過_center、_radius和_radiuscolor分别得到。我們通過在input結構中添加worldpos變量來請求目前繪制的像素在世界坐标中所處的位置。世界坐标的位置也是物體在編輯器中的真實位置。

surf()函數是真正繪制圓環的地方。它會計算繪制點到圓心的距離,然後判斷該距離是否屬于_radius到_radius + _radiuswidth範圍内,如果在這個範圍内,就使用標明的顔色;如果不在這個範圍内,就像我們見到過的其他着色器一樣直接采樣紋理映射的顔色。