關于ShaderLab,從我個人的理解上來看應該是分為三種類型。
1、Fixed function shader
固定渲染管線Shader,基于用于高級Shader在老顯卡無法顯示時的Fallback,使用的是ShaderLab語言,屬于真正的ShaderLab語言,和我們平時看到的shader的區別后面細說。
2、Vertex and Fragment Shader
可編程渲染管線,這種Shader包含Vertex Shader和Fragment Shader,也就是頂點著色器和片段著色器。頂點著色器會根據你自己的定義自動獲取頂點一些相關信息。使用CG/HLSL語法,小伙伴們平時應該都注意到了有時候在Shader中會出現#include "UnityCG.cginc"這類聲明,這里面就是Unity給我們做好的一個庫,你可以想像成C語言程序中的include,C#程序員可以想象成代碼文件開頭的Using引用,Android程序員可以將其想象成代碼開頭的import引用。
3、Surface Shader
unity自己最為推崇的Shader類型,使用Unity預制的光照模型來進行光照運算。也是使用CG/HLSL。
Unity的三種Shader對比相同點:
1、都必須從唯一一個根的Shader開始,也就是本系列資料1中解釋的調用函數。
2、Properties參數部分,作用和語法完全相同,沒有任何區別,沒有萬一。
3、具體的功能都在SubShader里去實現,如果有多個Subshader,那么機器不會全部執行,而是最多只執行一個,執行方式是從上自下開始運行硬件能夠支持的第一個SubShader,這樣做的目的主要是為了兼容不同類型的顯卡。
4、都可以貼上標簽,也就是Tags塊,例如Tags { "RenderType" = "Opaque" }????LOD 200 ????以及Lighting On等,這些的具體用法咱們后面細說。
5、結束的時候都可以用Fallback來進行對備胎Shader的使用,備胎的意思也就是如果所有的SubShader都不被硬件支持,就會去使用Fallback所指定的Shader。
6、都可以處理基本的功能,例如光照反射鏡面反射等。但是頂點片段著色器和表面著色器都可以實現固定管線實現不了的高級功能,例如基于UV計算的效果等。
Unity的三種Shader對比不同點:
1、固定管線和頂點片段著色器的SubShader下面還有pass{}通道,但是表面著色器已經將具體內容打包在光照模型里面了,所以不能加上pass{}通道。
2、固定管線每句代碼之后沒有分號,但是V&F著色器Sur著色器的每句代碼之后都必須加上分號,這種設計也許更符號碼農們的期望吧。
3、核心結構不同,?
固定管線的核心:
Material{} 以及 SetTexture[_MainTex]{}
V&F著色的核心:
CGPROGRAM //聲明使用CG語言
#pragma vertex vert //聲明頂點函數vert
#pragma frament frag //聲明片段函數frag
#include "UnityCG.cginc" //導入unity的CG庫
ENDCG
Surface Shader的核心:
CGPROGRAM //聲明使用CG語言
#pragma surface surf Lambert //聲明一個表面著色器函數surf,并使用Unity自己的光照模型和頂點函數
//Lambert為Unity自帶的光照模型函數,我們也可以使用自己寫的光照模型函數,并且使用自己寫的頂點函數
// ? ? ? surface 表面處理函數???光照模型函數??????頂點處理:函數
//#pragma surface??surf?????????lsyLightModel??????vertex:vert
//執行順序???頂點處理函數 -> 表面處理函數 -> 光照模型函數 ->顏色值
ENDCG