天天看點

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

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

在當今的遊戲行業中,最常見的一種紋理技術就是在物體的表面實作滾動紋理。使用這種技術我們可以實作如瀑布、河流、熔岩流等效果。它也是我們建立紋理動畫的一種基礎技術,在後面的章節中我們将對它進行詳細介紹。讓我們先來看看如何在一個表面着色器建立一個簡單的滾動效果。

在開始本節的學習之前,你需要建立一個新的着色器檔案和一個新的材質。這樣,我們就建立了一個簡潔漂亮的着色器,我們可以使用它來研究滾動效果。

首先,打開我們剛才建立的着色器檔案,然後輸入下面提到的代碼:

該着色器需要兩個新的屬性,我們可以用來控制紋理滾動的速度。是以,我們将添加x方向的速度屬性和y方向的速度屬性,如下代碼所示:

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

修改surf()函數,通過tex2d()函數來改變uv坐标。然後使用内置的_time變量來實作動态紋理,當我們點選unity播放按鈕時紋理會随時間運動起來。

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動
《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

下圖展示了使用滾動uv系統為你的環境建立一個簡單河流運動的效果圖。在紙質的書本上是很難展示運動效果的,但是請相信它是可以運動的。

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

這套紋理滾動系統首先需要聲明兩個屬性,使着色器的使用者能夠提高或降低紋理的滾動速度。它的作用在于我們可以從材質inspector面闆中擷取浮點值,然後傳遞給着色器裡的surf函數。有關着色器屬性的詳細資訊,請查閱第1章。

一旦我們從材質inspector面闆中擷取了浮點值,我們就可以使用它們實作着色器的uv偏移了。

在程式的開始,我們首先将uv值存儲在scrolleduv變量中。這個變量必須是一個float2或fixed2類型的變量,因為uv值是通過input結構體傳入的:

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

這樣,當通路網格的uv時,我們就可以使用滾動速度變量和内置的_time變量對紋理進行偏移。該内置變量傳回的是float4類型的值,這意味着當我們進入遊戲時,變量的每個組成部分都包含不同的時間值。

_time變量為我們提供一個基于unity遊戲時鐘的遞增型浮點值。是以,我們可以使用該時間值在uv方向上移動我們的uv值,也可以通過滾動速度變量來加快或減慢時間。

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

使用時間計算出正确的偏移量後,我們就可以添加新的偏移值到原有uv值上。這也是我們在下一行使用+=運算符的原因。我們要把原來的uv值,加上新的偏移量,然後傳遞給tex2d()函數作為新的uv紋理。這樣我們就建立了一個物體表面的紋理運動效果。由于我們隻對uv坐标進行修改,是以這些是模拟的紋理運動效果。

《Unity着色器和螢幕特效開發秘笈》—— 2.2 通過修改UV坐标實作紋理貼圖的滾動

繼續閱讀