說明:
Unity的Shader分爲三類:
- Fixed function shader——屬於固定渲染管線Shader, 基本用於高級Shader在老顯卡無法顯示時的Fallback。
- Vertex and Fragment Shader——屬於Unity常見Shder之一,可編程渲染管線.。
- Surface Shade——屬於Unity常見Shader之一,使用Unity預製的光照模型來進行光照運算。
Vertex and Fragment Shader與Surface Shade的共同點:
- 必須從唯一一個根Shader開始
- 可以設置Properties參數部分,作用及語法完全相同
- 具體功能都在SubShader裏(Subshader: 子Shader,Shader會自上而下運行第一個硬件能支持的Subshader,主要作用是對不用硬件的支持。)
- 都可以打標籤,例如Tags { "RenderType" = "Opaque" } LOD100 等
- 都可以設置Fallback,如“Fallback "Legacy Shaders/Transparent/VertexLit"”
- 都可以處理基本的功能,例如光照漫反射(Diffuse)以及鏡面反射(Specular)。
Vertex and Fragment Shader與Surface Shade的差異:
- Vertex and Fragment Shader在subshader下面還有pass{}
- Surface Shader,由於已經將具體內容打包在光照模型了,不能加pass{},加了會報錯。
- Vertex and Fragment Shader的核心是:
CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" ENDCG
Surface Shader的核心:
<pre name="code" class="html">CGPROGRAM #pragma surface surf Lambert ENDCG
Surface Shader是Unity3d自帶光照模型Lambert,也不做頂點處理,那麼只需要一個表面處理函數surf即可
Surface Shade標準的輸出結構的三種:
SurfaceOutput
struct SurfaceOutput
{
<span style="white-space:pre"> </span>fixed3 Albedo; // 漫反射顏色
<span style="white-space:pre"> </span>fixed3 Normal; // 切線空間法線,如果賦值的話
<span style="white-space:pre"> </span>fixed3 Emission;
<span style="white-space:pre"> </span>half Specular; // 高光強度,範圍是0-1
<span style="white-space:pre"> </span>fixed Gloss; // specular intensity
<span style="white-space:pre"> </span>fixed Alpha; // 透明度
};
SurfaceOutputStandard
struct SurfaceOutputStandard
{
fixed3 Albedo; // 基礎 (漫反射或鏡面反射) 顏色
fixed3 Normal; // 切線空間法線,如果賦值的話
half3 Emission;
half Metallic; // 0=非金屬, 1=金屬
half Smoothness; // 0=粗糙, 1=光滑
half Occlusion; // 遮擋(默認1)
fixed Alpha; // 透明度
};
SurfaceOutputStandardSpecular
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo; // 漫反射顏色
fixed3 Specular; // 鏡面反射顏色
fixed3 Normal; // 切線空間法線,如果賦值的話
half3 Emission;
half Smoothness; // 0=粗糙, 1=光滑
half Occlusion; // 遮擋(默認1)
fixed Alpha; // 透明度
};