本節書摘來自華章計算機《unity着色器和螢幕特效開發秘笈(原書第2版)》一書中的第2章,第2.2節,作者 [英]艾倫朱科尼(alan zucconi)[美]肯尼斯拉默斯(kenneth lammers),譯 占紅來,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在開始學習紋理映射之前,我們需要先了解漫反射着色是怎麼工作的。某些物體的顔色比較均勻,表面很光滑,但是又不是光滑到那種像鏡子一樣光亮的程度。這種非反光材料最好的渲染方式就是使用漫反射着色器。雖然在真實世界中純漫反射材料本身并不存在,但在遊戲世界中漫反射着色器是一種大量用到的相對廉價的着色方式。
建立漫反射着色器有多種方式。最快的一種方式是從unity 5 的标準着色器開始,然後編輯标準着色器,移除所有紋理。在第1章中我們就是這麼做的。
我們從标準着色器開始,按照下面的步驟逐漸進行:
删除除_color之外的所有屬性:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4kDMlFWYlN2MhhTY5UGOmFjY3QzN1kDNiVGNzUWNjlTY5EGOidDM38CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
在subshader{}部分,删除_maintex、_glossiness和_metallic變量。注意不要删除uv_maintex,因為cg不接受空的輸入。這個值會被忽略。
删除surf()函數的函數體,用下面的代碼替換:
你的着色器應該看起來是這樣的:
因為該着色器是在一個标準着色器的基礎上修改的,它會使用基于實體基礎的渲染方式來模拟光照行為。如果你想做一種非拟實的外觀,可以直接修改第一個#pragma指令來讓其使用lambert而不是standard。如果你這麼做了,還應該将surfaceoutputstandard替換為surfaceoutput。
着色器中,材質的渲染屬性和光照模型之間是通過表面輸出來通信的。表面輸出是對目前光照模型所需的所有參數的一個封裝。是以你應該能了解不同的光照模型需要不同的表面輸出結構了。下面列出了unity 5中三種主要的表面輸出結構。
surfaceoutput結構有如下屬性:
fixed3 albedo:表示材質的漫反射顔色。
fixed3 normal:如果寫的話表示切面法線。
fixed3 emission:表示材質發射的顔色(該屬性在标準着色器中聲明為half3)。
fixed alpha:表示材質的透明度。
half specular:表示光亮度,值從0到1。
fixed gloss:表示光強度。
surfaceoutputstandard結構有如下屬性:
fixed albedo:表示材質的基礎顔色(表示是漫反射還是高光)。
fixed3 normal。
half3 emission:該屬性聲明為half3,而在surfaceoutput中名字是fixed3。
fixed alpha。
half occlusion:表示遮擋,預設是1。
half smoothness:表示光滑度,0表示粗糙,1表示光滑。
half metallic:0表示非金屬,1表示金屬。
surfaceoutputstandardspecular結構有如下屬性:
fixed3 albedo。
half3 emission。
half occlusion。
half smoothness。
fixed3 specular:表示高光顔色,與surfaceoutput結構中的specular屬性有很大不同,這裡可以指定一種顔色而非單一值。
正确使用表面着色器很重要的一點是用正确的值初始化表面輸出結構。