深入淺出掌握Unity ShaderLab語法基礎(chǔ)
一、Shader基本介紹
shader的大致結(jié)構(gòu)如下:
Shader "Name"
{
Properties
{
//開放到材質(zhì)面板的屬性
}
SubShader
{
//頂點-片段著色器
//或者表面著色器
//或者固定函數(shù)著色器
}
SubShader
{
//更加精簡的版本
//為了在舊的圖形設(shè)備上運行
}
...
Fallback "Name"
}相關(guān)特性:
- Shader中可以編寫多個子著色器(SubShader),但至少需要一個。
- 如果是頂點-片段著色器(Vertex-Fragment Shader),每個子著色器中還會包含一個甚至多個Pass。同時,該子著色器內(nèi)所有的Pass會依次執(zhí)行,每個Pass的輸出的結(jié)果會以指定的方式與上一步的結(jié)果進行混合,最終輸出。
- 如果是表面著色器(Surface Shader),著色器的代碼也是包含在子著色器中,但與頂點-片段著色器不同的是,表面著色器不會再嵌套Pass。
二、Properties(屬性)
1、數(shù)值類屬性
Unity Shader的數(shù)值類屬性基本都是浮點型(Float)數(shù)據(jù),雖然Unity提供了整型(int)數(shù)據(jù),但在編譯的時候最終都會轉(zhuǎn)化成浮點型。
數(shù)值類屬性有兩種:
name("display name",Float)=number
name("display name",Range(min,max))=number- Float是任意數(shù)值的浮點型數(shù)據(jù),在材質(zhì)面板上作為數(shù)字輸入框顯示。
- Range是介于最大值和最小值之間的浮點型數(shù)據(jù),在材質(zhì)面板上作為滑動條顯示。
2、顏色和向量類屬性
顏色類語法定義:
name("display name",Color)=(0,0,0,0)
name("display name",Vector)=(0,0,0,0)- Color是顏色類型的數(shù)據(jù),由RGBA四個分量定義,在材質(zhì)面板上顯示為取色器(Color Picker)。
- Vector是向量類型的屬性,是一個四維數(shù)組,在材質(zhì)面板上作為顯示4個連續(xù)的數(shù)值輸入框,分別為X,Y,Z,W。
3、紋理貼圖類屬性
name("display name",2D)="defaulttexture"{}
name("display name",Cube)="defaulttexture"{}
name("display name",3D)="defaulttexture"{}- 2D屬性是紋理類屬性中最常見使用的,包括漫反射貼圖、法線貼圖等;
- Cube(全稱 Cube map texture 立方體紋理),是由前、后、左、右、上、下6張有聯(lián)系的2D貼圖拼成的立方體,主要用作反射,例如Skybox和Reflection Prob。
- 3D紋理只能被腳本創(chuàng)建,在實際使用中很少使用。
4、所有類型屬性匯總
Shader "Custom/Properties"
{
Properties
{
_MyFloat("Float Properties",Float)=1 //浮點類型
_MyRange("Range Properties",Range(0,1))=0.1 //范圍類型
_MyColor("ColorProperties",Color)=(1,1,1,1) //顏色點類型
_MyVector("Vector Properties",Vector)=(0,1,0,0) //向量類型
_MyTex("Texture Properties",2D)="white"{} //2D貼圖類型
_MyCube("Cube Properties",Cube)=""{} //立方體貼圖類型
_My3D("3D Properties",3D)=""{} //3D貼圖類型
}
SubShader
{
Pass
{
//pass 中的代碼
}
}
Fallback "Diffuse"
}三、SubShader
在Unity中,每個Shader都會包含至少一個SubShader。同時,每個SubShader都可以設(shè)置一個或多個標(biāo)簽(Tags)和渲染狀態(tài)(States),然后定義至少一個Pass。

1、SubShader的標(biāo)簽
標(biāo)簽的語法如下:
Tags{"TagName1"="Value1" "TagName2"="Value2"}標(biāo)簽通過鍵值對的形式進行聲明,并且沒有使用數(shù)量限制。
渲染隊列(Queue)
在SubShader中可以使用Queue(隊列)標(biāo)簽確定物體的渲染順序,Unity定義了五種渲染隊列,如下:

也可以自己指定一個隊列,例如:
Tags{"Queue"="Geometry+1"}
這個隊列表示在所有的非透明幾何體繪制完成之后再進行繪制。渲染類型(RenderType)
RenderType標(biāo)簽可以將Shader劃分為不同的類別,用于后期進行Shader替換或者產(chǎn)生攝像機的深度紋理,具體如下:

禁用批處理
當(dāng)使用批處理(Batching)的時候,幾何體會被變換到世界空間,模型空間會被丟棄。
這會導(dǎo)致某些使用模型空間頂點數(shù)據(jù)的Shader最終無法實現(xiàn)所希望的效果。而開啟DisableBatching(禁用批處理)可以解決這個問題。
禁用批處理標(biāo)簽有三個數(shù)值可以使用:
(1) “DisableBatching”=“True”:總是禁用批處理。
(2) “DisableBatching”=“False”:不禁用批處理,默認(rèn)值。
(3) “DisableBatching”=“LODFading”:當(dāng)LOD效果激活的時候才會禁用批處理,主要用于地形系統(tǒng)上的樹。
禁止陰影投射
"ForceNoShadowCasting":禁止陰影投射標(biāo)簽。設(shè)置為Ture時,Shader物體就不會對其他物體產(chǎn)生投射陰影了。
忽略Projector
IgnoreProjector標(biāo)簽:不讓物體受到Projector(投影機)的投射。
它有兩個數(shù)值可以使用:“True"和"False”,分別為忽略投射機和不忽略投射機。
一般半透明的Shader都會開啟這個標(biāo)簽。
其他標(biāo)簽
例如,CanUseSpriteAtlas,PreviewType。
2、Pass的渲染狀態(tài)

3、Fallback
Fallback在所有SubShader之后進行定義。當(dāng)所有的SubShader都不能在當(dāng)前顯卡運行的時候,就會運行Fallback定義的Shader。
語法:Fallback "name"。
最常用于Fallback的Shader為Unity內(nèi)置的Diffuse。
到此這篇關(guān)于深入淺出掌握Unity ShaderLab語法基礎(chǔ)的文章就介紹到這了,更多相關(guān)Unity ShaderLab語法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用checked語句防止數(shù)據(jù)溢出的解決方法
本篇文章是對用checked語句防止數(shù)據(jù)溢出的解決方法進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實現(xiàn)一個簡單實用的TXT文本操作及日志框架詳解
這篇文章主要給大家介紹了關(guān)于利用C#如何實現(xiàn)一個簡單實用的TXT文本操作及日志框架的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們一起來看看吧2018-07-07
C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實現(xiàn)方法,結(jié)合實例形式較為詳細(xì)的分析了單鏈表的原理、定義與C#具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11

