下面繼續看基於surface的shader代碼,基本與Vertex&Fragment shader差很少,只是不能寫pass,而後只須要聲明surface函數,就能處理全部的事情。html
1 Shader "T1/Hero/Diffuse" { 2 Properties { 3 _MainTex ("Base (RGB)", 2D) = "white" {} 4 _Color ("Main Color", Color) = (1,1,1,1) 5 [HideInInspector]_BlendColor("_Blend Color", Color) = (1, 1, 1, 0) 6 [HideInInspector]_BlendIntensity ("BlendColorShininess", Range (1, 4)) = 1 7 } 8 SubShader { 9 Tags { "Queue" = "Geometry+20" "RenderType"="Opaque"} 10 LOD 200 11 12 CGPROGRAM 13 // #include "T1.cginc" 14 #pragma surface surf LambertT1HeroSideLight 15 #pragma only_renderers d3d9 opengl 16 17 sampler2D _MainTex; 18 fixed4 _Color; 19 20 struct Input { 21 float2 uv_MainTex; 22 }; 23 24 #include "T1.cginc" 25 26 void surf (Input IN, inout SurfaceOutput o) { 27 half4 c = tex2D (_MainTex, IN.uv_MainTex) ; 28 #if defined (UNITY_PASS_FORWARDBASE) || defined (UNITY_PASS_PREPASSFINAL) 29 o.Albedo = lerp (c.rgb* _Color.rgb, _BlendColor * _BlendIntensity, _BlendColor.a); 30 #else 31 o.Albedo = c.rgb* _Color.rgb; 32 #endif 33 o.Alpha = 0; 34 o.Emission = c.rgb * _heroSelfIllumin; 35 } 36 ENDCG 37 } 38 FallBack "Hidden/T1/VertexLit-Hero" 39 }
第3行的_MainTex聲明後,就能夠在第17行中引用到。編輯器
第5-6行的HideInInspector意思是不在編輯器的屬性界面顯示,隱藏起來。而後_BlendColor表示一個顏色,_BlendIntensity表示0-1的值。看後面的意思能夠得知是混合顏色和混合強度。ide
第9行的RenderType=Opaque表示聲明是一個不透明的物體,具體解釋在這裏,而後"Queue" = "Geometry+20"其實就是說渲染層次是2000+20,就是比通常的不透明物體層次要高一點。函數
第10行的LOD這個數值決定了咱們能用什麼樣的 Shader。在Unity的Quality Settings中咱們能夠設定容許的最大LOD,當設定的LOD小於SubShader所指定的LOD時,這個SubShader將不可用。Unity 內建Shader定義了一組LOD的數值。具體解釋在這裏。200是默認的diffuse值。spa
第14行的#pragma surface surf Lambert,它聲明瞭咱們要寫一個表面Shader,並指定了光照模型。它的寫法是這樣的3d
#pragma surface surfaceFunction lightModel [optionalparams]code
Lambert就是普通的diffuse漫反射光照模型。htm
第15行#pragma only_renderers d3d9 opengl表示限制這個shader只編譯在d3d9和opengl上。具體解釋在這裏blog
第17行sampler2D就是GLSL中的2D貼圖的類型,相應的,還有sampler1D,sampler3d,samplerCube等等格式。不囉嗦了圖片
第18行的fixed4主要用來表示顏色rgba四個數值。
第20行的Input聲明後,主要是用來給surf函數來使用的。
第26行-34行主要是CG規定了聲明爲表面着色器的方法(就是咱們這裏的surf)的參數類型和名字,所以咱們沒有權利決定surf的輸入輸出參數的類型,只能按 照規定寫。這個規定就是第一個參數是一個Input結構,第二個參數是一個inout的SurfaceOutput結構。
這裏用到了一個tex2d函數,這是CG程序中用來在一張貼圖中對一個點進行採樣的方法,返回一個float4。這裏對_MainTex在輸入點上進行了採 樣,並將其顏色的rbg值賦予了輸出的像素顏色。
28行的主要意思見這裏。這裏主要是前向渲染或者延遲渲染的話,物體顏色就須要考慮混合的顏色和混合的亮度,不然就直接取顏色。
33行,設置無透明。
34行表示自發光,這個值是圖片的顏色乘以t1定義的自發光亮度常量。