深入淺出掌握Unity ShaderLab語法基礎(chǔ)
一、Shader基本介紹
shader的大致結(jié)構(gòu)如下:
Shader "Name" { Properties { //開放到材質(zhì)面板的屬性 } SubShader { //頂點(diǎn)-片段著色器 //或者表面著色器 //或者固定函數(shù)著色器 } SubShader { //更加精簡的版本 //為了在舊的圖形設(shè)備上運(yùn)行 } ... Fallback "Name" }
相關(guān)特性:
- Shader中可以編寫多個子著色器(SubShader),但至少需要一個。
- 如果是頂點(diǎn)-片段著色器(Vertex-Fragment Shader),每個子著色器中還會包含一個甚至多個Pass。同時,該子著色器內(nèi)所有的Pass會依次執(zhí)行,每個Pass的輸出的結(jié)果會以指定的方式與上一步的結(jié)果進(jìn)行混合,最終輸出。
- 如果是表面著色器(Surface Shader),著色器的代碼也是包含在子著色器中,但與頂點(diǎn)-片段著色器不同的是,表面著色器不會再嵌套Pass。
二、Properties(屬性)
1、數(shù)值類屬性
Unity Shader的數(shù)值類屬性基本都是浮點(diǎn)型(Float)數(shù)據(jù),雖然Unity提供了整型(int)數(shù)據(jù),但在編譯的時候最終都會轉(zhuǎn)化成浮點(diǎn)型。
數(shù)值類屬性有兩種:
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ì)面板上作為滑動條顯示。
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)建,在實(shí)際使用中很少使用。
4、所有類型屬性匯總
Shader "Custom/Properties" { Properties { _MyFloat("Float Properties",Float)=1 //浮點(diǎn)類型 _MyRange("Range Properties",Range(0,1))=0.1 //范圍類型 _MyColor("ColorProperties",Color)=(1,1,1,1) //顏色點(diǎn)類型 _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)簽通過鍵值對的形式進(jìn)行聲明,并且沒有使用數(shù)量限制。
渲染隊(duì)列(Queue)
在SubShader中可以使用Queue(隊(duì)列)標(biāo)簽確定物體的渲染順序,Unity定義了五種渲染隊(duì)列,如下:
也可以自己指定一個隊(duì)列,例如:
Tags{"Queue"="Geometry+1"}
這個隊(duì)列表示在所有的非透明幾何體繪制完成之后再進(jìn)行繪制。渲染類型(RenderType)
RenderType標(biāo)簽可以將Shader劃分為不同的類別,用于后期進(jìn)行Shader替換或者產(chǎn)生攝像機(jī)的深度紋理,具體如下:
禁用批處理
當(dāng)使用批處理(Batching)的時候,幾何體會被變換到世界空間,模型空間會被丟棄。
這會導(dǎo)致某些使用模型空間頂點(diǎn)數(shù)據(jù)的Shader最終無法實(shí)現(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(投影機(jī))的投射。
它有兩個數(shù)值可以使用:“True"和"False”,分別為忽略投射機(jī)和不忽略投射機(jī)。
一般半透明的Shader都會開啟這個標(biāo)簽。
其他標(biāo)簽
例如,CanUseSpriteAtlas,PreviewType。
2、Pass的渲染狀態(tài)
3、Fallback
Fallback在所有SubShader之后進(jìn)行定義。當(dāng)所有的SubShader都不能在當(dāng)前顯卡運(yùn)行的時候,就會運(yùn)行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)文章
C# 繪制統(tǒng)計圖大全(柱狀圖, 折線圖, 扇形圖)
本篇文章介紹了C# 繪制統(tǒng)計圖大全,其中包括狀圖, 折線圖, 扇形圖,有需要的同學(xué)可以了解一下。2016-11-11c#讀取圖像保存到數(shù)據(jù)庫中(數(shù)據(jù)庫保存圖片)
這篇文章主要介紹了使用c#讀取圖像保存到數(shù)據(jù)庫中的方法,大家參考使用吧2014-01-01使用aspose.word 第三方的插件實(shí)現(xiàn)導(dǎo)出word
本文給大家分享的是一個使用使用aspose.word 第三方的插件實(shí)現(xiàn)導(dǎo)出word的實(shí)例,十分的實(shí)用,有需要的小伙伴可以參考下。2015-06-06那些年,我還在學(xué)習(xí)C# 學(xué)習(xí)筆記
那些年學(xué)了ASP.NET后,才開始學(xué)習(xí)C#,說來也怪,怎么學(xué)了ASP.NET才來學(xué)習(xí)C#,其實(shí)沒有什么的2012-03-03C#連接Oracle數(shù)據(jù)庫使用Oracle.ManagedDataAccess.dll
這篇文章主要介紹了C#使用Oracle.ManagedDataAccess.dll的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11WPF+WriteableBitmap實(shí)現(xiàn)高性能曲線圖的繪制
這篇文章主要為大家詳細(xì)介紹了如何利用WPF+WriteableBitmap實(shí)現(xiàn)高性能曲線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-08-08C#實(shí)現(xiàn)協(xié)同過濾算法的實(shí)例代碼
這篇文章介紹了C#實(shí)現(xiàn)協(xié)同過濾算法的實(shí)例代碼,有需要的朋友可以參考一下2013-07-07