Unity的shader學習2

下面繼續看基於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

  • surface - 聲明的是一個表面着色器
  • surfaceFunction - 着色器代碼的方法的名字
  • lightModel - 使用的光照模型。

 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定義的自發光亮度常量。

相關文章
相關標籤/搜索