天天看點

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

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

在物體表面滑動紋理是現代遊戲行業中一種非常常用的紋理技術。通過滑動紋理可以建立出諸如瀑布、河流、熔岩等諸多生動的特效。這種技術也是制作精靈特效的基礎,關于這部分内容會放在本章另外一小節中。首先讓我們看一下如何在表面着色器中建立一個簡單的滑動特效。

開始這一節之前,需要建立一個新的着色器檔案和材質檔案。需要一個幹淨的着色器來開始我們對滑動特效的學習。

首先,需要導入新建立的着色器檔案,然後按照下面的步驟輸入代碼:

着色器需要兩個新的屬性來控制紋理的滑動速度,是以我們首先給x方向和y方向各建立一個速度屬性。代碼如下:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

修改cgprogram部分的cg屬性,建立一些新變量來通路新添加的屬性:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

修改表面函數來修改提供給tex2d()函數的uv值。然後使用内建的_time變量來在按下play按鈕的時候動态變更uv值:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

下圖便是使用滑動uv系統建立的一條簡單的河流的樣子。你可以從本書附帶的代碼檔案中檢視到scrollinguvs的值。

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

滑動系統首先聲明一些屬性,通過這些屬性着色器可以增加或者減小特效的滑動速度。在底層,這些浮點數會從材質的inspector标簽頁傳遞到着色器的表面函數。關于着色器屬性的更多内容請查閱第1章。

一旦我們得到了這些從材質inspector标簽頁中傳遞過來的浮點值,就可以根據這些值來偏移着色器中的uv值。

開始之前我們首先将uv值儲存在另外一個名為scrolleduv的變量中。這個變量必須是float2或者fixed2類型的,因為傳給我們的uv值在input結構中聲明為了float2類型:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

一旦得到了網格的uv值,我們就可以用滑動速度變量和内建的遞歸時間變量_time來對紋理進行偏移了。這個内建的時間變量傳回一個float4類型的變量,意味着該變量的每一個元件包含一個不同的時間值作為系統的遊戲時間。

關于這個遞歸時間的完整描述可以檢視下面這個連結:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

這個_time變量會随着遊戲時間的推移給我們提供一個遞增的浮點數值,是以可以使用這個值來移動我們的uv值,具體的移動量是時間和滑動速度的乘積:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

正确地計算了不同時刻的偏移之後,我們可以将新計算出來的偏移量添加到原始的uv位置。這就是為什麼在下一行代碼中使用了+=運算符,因為我們想以原始的uv位置作為基礎來添加一些偏移量,然後将添加了偏移量的uv值傳遞給tex2d()函數作為紋理的新uv值。通過這些代碼就可以讓紋理在表面移動了。我們其實完全是在人為操作這些uv值,是以實際上是通過操作uv值來僞造出一種紋理在移動的假象:

《Unity着色器和螢幕特效開發秘笈(原書第2版)》——2.5 通過修改UV值來滑動紋理

繼續閱讀