對于3D游戲來說,有很多絢麗的效果,都是靠shader(著色器)來實現(xiàn)的。不過很多朋友估計都不會編寫shader,阿趙我自己也只是看了個入門,明白了它的原理,很多具體的效果都寫不出來的。這次來介紹一個Unity3D的第三方shader編輯器:Strumpy。這個編輯器是完全可視化編輯,使用起來相對簡單一點。
先來看看我們這次需要做的例子:
我們需要使用Strumpy,編輯出這樣一個shader:包括了漫反射通道、法線通道、高光通道,以及在模型的邊緣運動的光效。
很顯然,Unity3D自帶的shader沒有能直接實現(xiàn)這樣的功能的,最多也只能使用法線和高光通道而已。
由于這個例子稍微復(fù)雜,所以我們先來做一個更簡單的例子,來熟悉一下strumpy的界面和基本操作。首先肯定是要先下載Strumpy插件了。在Asset Store里面有,免費下載的。我這里使用的是4.0a版本。
下載完之后導(dǎo)入,會看到多了一個選項:
選擇之后打開了Strumpy的編輯窗口:
Flie的功能很直觀,新建,讀取,保存和導(dǎo)出的功能,我們可以先看看讀取功能
插件自帶了一些已經(jīng)編輯好的范例,有興趣的朋友可以逐個看看,會有很大的收益。
然后我們來正式開始做這個簡單的例子,我們準(zhǔn)備了一張帶有透明通道的貼圖(拿斬首大刀的阿趙),接下來我們做一個shader,把這張貼圖顯示在一個面片上面,使它實現(xiàn)漫反射通道和透明通道的顯示。
我們新建一個著色器編輯:
注意看,新建時,在Settings的標(biāo)簽是紅色的,然后Shader Name也是紅色的,這是提醒我們,每一個shader必須要先有一個名稱,而這個名稱就是以后你在材質(zhì)欄里面選擇的材質(zhì)名稱了。比如你可以用“myshader/test”,這樣test材質(zhì)會出現(xiàn)在myshader下面。
輸入材質(zhì)名詞之后,我們先來Inputs里面,新建一個輸入。這個輸入,就是我們平常在Unity自帶的材質(zhì)球里面看到的輸入通道了。假如我們需要它能調(diào)節(jié)顏色,那么就要新建一個顏色的輸入,假如需要調(diào)用貼圖,就要新建一個貼圖的輸入。這里我們新建一個Unity預(yù)設(shè)的MainTexture。熟悉用腳本替換材質(zhì)貼圖的朋友估計很熟悉這個標(biāo)簽的含義了。
新建之后,我們可以看到,出現(xiàn)了一個貼圖選擇的通道,就像我們平常操作的自帶材質(zhì)球一樣。
接下來我們會新建一些節(jié)點,然后對他們進(jìn)行編輯。
創(chuàng)建節(jié)點的方式有兩種:
第一種是在Nodes里面選擇相應(yīng)的節(jié)點:
第二種是在節(jié)點編輯的窗口鼠標(biāo)右鍵單擊,選擇相應(yīng)的節(jié)點。
我個人比較習(xí)慣第二種方法。
我們選擇了一個Sampler2D的輸入
剛生成的時候,這個節(jié)點是紅色的,因為我們沒有指定輸入的來源。想起剛才我們新建的Input了吧?那個MainTexture指定在這里。
在選中該節(jié)點的情況下,來到Node的標(biāo)簽,會看到提示錯誤了
我們選擇_MainTex
這時候,節(jié)點就不再是紅色了,而是出現(xiàn)了兩項輸出,分別是2D采樣和UV信息。節(jié)點名稱里面,也會相應(yīng)的顯示出_MainTex,也就是我們剛才新建的Input的名稱。
接下來我們新建一個Tex2D方法節(jié)點。
然后像上圖一樣,用鼠標(biāo)把他們之間連起來。
這時候,把我們預(yù)先準(zhǔn)備好的貼圖指定在貼圖通道里面
點擊預(yù)覽窗口的Update Preview,會看到預(yù)覽的物體上面出現(xiàn)了我們的貼圖
為了便于觀察,我們選擇一個片面模型。這時候,漫反射通道已經(jīng)完成了,接下來我們繼續(xù)做透明通道。
如上圖一樣,把A連接到Alpha通道。
然后來到Settings,按上圖設(shè)置一下。
打開背景顯示,會看到透明通道已經(jīng)生效了。
在完成了以上的小例子之后,我們正式來解釋一下Strumpy各個部分的意思吧。
在master里面,分別是各個通道的最終輸出。
節(jié)點是通過有方向性的線條來連接的,分為輸入端和輸出端,上圖是一個單向輸入輸出的例子。
再來是一個運算的例子,Add是相加的操作,這里是兩個輸入端進(jìn)入了相加,然后輸出一個結(jié)果。
在這里要說明一下的是,這些操作很大一部分都是數(shù)學(xué)運算的方法,比如加減乘除、sin、cos之類,各位在學(xué)習(xí)之前最好要先理解他們的意思。比如相加就是互相疊加,兩張圖相加會整張圖都變得更亮。相乘是波峰波谷的疊加,兩張圖相乘,會使亮的地方更亮,暗的地方更暗。其他的方法請各位自行百度去查閱了,就不一一說明。
再來看看設(shè)置的選項
如果曾經(jīng)自己寫過shader的朋友,對于這些選項應(yīng)該是很熟悉的。比如很多朋友問的雙面顯示,其實就是把CullMode選擇為Off就行。
介紹完基本功能,我們正式的來做這次的目標(biāo)例子了。
這里我們準(zhǔn)備了一個模型。
模型帶有了漫反射貼圖和法線貼圖。
首先新建一個著色器編輯,然后給shader起名為:myShader
按照第一個例子的操作,我們完成了漫反射通道。
為了應(yīng)用在我們的模型上,我們需要先生成一個shader。選擇導(dǎo)出(Export As)
給shader起一個文件名。這個名稱沒有太大的意義。
導(dǎo)出之后,我們來到材質(zhì)球選擇的地方,會看到了我們新建的myShader,選擇它。
然后指定漫反射貼圖,我們的模型變成了上圖的效果。
接下來,我們在Inputs里面新建一個凹凸貼圖的輸入
然后完成法線通道節(jié)點的編輯。由于需要使用法線貼圖,所以需要加入一個UnPackNormal的節(jié)點。
這時候,我們會發(fā)現(xiàn)輸入通道處多了Normalmap通道,我們把法線貼圖賦予上去。模型變成上圖的效果。
我們再新建一個顏色輸入,作為高光的顏色。
完成高光通道和光澤強(qiáng)度的節(jié)點編輯。
這里我用了一個Multiply(相乘),目的是讓光澤強(qiáng)度范圍的對比度更大,顯得高光會更尖銳一點。高光顏色直接連接到Specular通道。
現(xiàn)在我們的模型已經(jīng)擁有了一定的質(zhì)感了。由于模型原來是沒有法線貼圖的,我拿了漫反射貼圖來直接轉(zhuǎn)換,所以效果差了點,有興趣的朋友可以自己做法線貼圖增強(qiáng)效果。
接下來做有動畫效果的光。
我們新建了幾個輸入:發(fā)光顏色(_LightColor),一個發(fā)光顏色的遮罩貼圖(_Light),一個浮點(_dir)作為光運動的方向,一個范圍選擇(_RimPow)作為發(fā)光強(qiáng)度的控制。
這張是發(fā)光遮罩貼圖,是一張黑白的梯度圖。
這一個步驟的節(jié)點編輯有點復(fù)雜,基本的思路是將顏色和遮罩貼圖混合在一起,并用時間控制UV動畫:
1、遮罩貼圖我用了ViewDirection和Fresnel結(jié)合控制顯示方向,并用_RimPow作為顯示方向的次冪控制顯示強(qiáng)度。
2、為了讓光會隨著時間自己做動畫,我是用來Time和_dir相乘,這樣可以控制動畫的速度和方向。
3、為了讓UV移動做動畫,我用了UV_Pan。記得UV_Pan需要選擇輸入的軸,這里我選擇了Y軸。
4、最后,我把發(fā)光顏色和遮罩運算的結(jié)果相乘,達(dá)到疊加波峰改變顏色的目的。
最后,發(fā)布shader,根據(jù)需要選擇相應(yīng)的遮罩貼圖,指定發(fā)光的顏色、強(qiáng)度和方向,我們的例子就完成了。
補(bǔ)充說明幾點:
1、可能很多功能自帶的shader都有,不過有時候你就是會需要一些功能特殊一點的shader,具體需要什么輸入通道,和怎樣的操作,請根據(jù)實際情況考慮。
2、關(guān)于即時鏡面反射的shader,估計很多朋友都很感興趣。不過我這里不打算詳細(xì)介紹,因為unity沒有直接即時反射運算的shader。
簡單說明一下其原理:
在自帶的水面和憤怒機(jī)器人場景里面,我們都看到了類似鏡面反射的效果,其實這都是一種欺騙。做法不算復(fù)雜,其實是根據(jù)了當(dāng)前攝像機(jī)的位置,新建了一個相對角度的反射攝像機(jī),并把反射攝像機(jī)看到的內(nèi)容渲染成RenderTexture。最后把RenderTexture和位置矩陣輸入到普通材質(zhì)的貼圖通道,達(dá)到好像即時反射的效果。水面的例子做法會傻一點,因為它是針對水面物體自己生成了一個反射攝像機(jī),所以的反射效果只會對水面本身有效果,每個可以反射的面,都要單獨生成。而憤怒機(jī)器人里面的例子會聰明很多,它會在攝像機(jī)的腳本里面根據(jù)預(yù)先選擇的可反射的圖層,統(tǒng)一生成了一張RenderTexture,并讓所有可以反射的shader使用。
結(jié)合著即時反射這個例子,可以看出實際上很多特殊的效果,都不是單獨的shader能直接實現(xiàn)的,還需要到其他的腳本去配合。