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

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

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

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

3、Fallback
Fallback在所有SubShader之后進(jìn)行定義。當(dāng)所有的SubShader都不能在當(dāng)前顯卡運(yùn)行的時(shí)候,就會(huì)運(yùn)行Fallback定義的Shader。
語(yǔ)法:Fallback "name"。
最常用于Fallback的Shader為Unity內(nèi)置的Diffuse。
到此這篇關(guān)于深入淺出掌握Unity ShaderLab語(yǔ)法基礎(chǔ)的文章就介紹到這了,更多相關(guān)Unity ShaderLab語(yǔ)法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中GraphicsPath的Warp方法用法實(shí)例
這篇文章主要介紹了C#中GraphicsPath的Warp方法用法,實(shí)例分析了Warp方法的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06
Unity3D實(shí)現(xiàn)簡(jiǎn)易五子棋源碼
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)簡(jiǎn)易五子棋源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
使用checked語(yǔ)句防止數(shù)據(jù)溢出的解決方法
本篇文章是對(duì)用checked語(yǔ)句防止數(shù)據(jù)溢出的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#中ListView控件實(shí)現(xiàn)窗體代碼
這篇文章主要介紹了C#中ListView控件實(shí)現(xiàn)窗體的核心代碼,非常不錯(cuò),具有參考借鑒價(jià)值,對(duì)c#listview相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-08-08
C#實(shí)現(xiàn)一個(gè)簡(jiǎn)單實(shí)用的TXT文本操作及日志框架詳解
這篇文章主要給大家介紹了關(guān)于利用C#如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單實(shí)用的TXT文本操作及日志框架的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來(lái)看看吧2018-07-07
C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實(shí)例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了單鏈表的原理、定義與C#具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
C#計(jì)算輸入漢字GBK編碼后十六進(jìn)制數(shù)輸出的方法
這篇文章主要介紹了C#計(jì)算輸入漢字GBK編碼后十六進(jìn)制數(shù)輸出的方法,涉及C#編碼操作相關(guān)技巧,需要的朋友可以參考下2015-04-04

