眾所周知,Unity3D的所有渲染工作是都離不開著色器的,也就是Shader。它實際上就是一小段程序,它負責將輸入的Mesh以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設置,將這些內容打包存儲在一起,得到的就是一個Material。之后,我們便可以將材質賦予合適的renderer來進行渲染了。講到最后Shader就是一段規定好輸入顏色貼圖和輸出渲染器能夠讀懂的點和顏色的程序。
一、Shader種類
Shader大體上是分為三類:
1、Surface Shader——表面著色器
包含光照運算,3D場景
2、Vertex and Fragment Shader ——頂點/片段著色器
不包含光照運算,2D場景,特效
3、Fixed?Function Shader ——固定函數著色器
不推薦
![Unity3D渲染的重要編程——著色器編程 Unity3D渲染的重要編程——著色器編程]()
頂點/片段著色器
?二、Shader基本結構
隨便用個文本編輯器打開剛才新建的Shader:
?![Unity3D渲染的重要編程——著色器編程 Unity3D渲染的重要編程——著色器編程]()
![Unity3D渲染的重要編程——著色器編程 Unity3D渲染的重要編程——著色器編程]()
屬性Properties{}
舉例:_Name(“Display Name”, type) = defaultValue[{options}]
_Name:變量名
Display Name:顯示名
type:類型則有以下幾種
![Unity3D渲染的重要編程——著色器編程 Unity3D渲染的重要編程——著色器編程]()
?defaultValue:默認值則跟類型相對應
?
options:可選項
2D / Rect / Cube –?填入OpenGL的TexGen的模式,至少為{}
實例:
定義一個默認值為半透明藍色的顏色Main Color _MainColor (“Main Color”, Color) = (0, 0, 1, 0.5)
定義一個默認值為純白色的紋理Main Texture _MainTex (“Main Texture”, 2D) = “white” {}
?子著色器SubShader
1、Tags標簽
Tags { 'TagName1' = 'Value1' 'TagName2' = 'Value2' }
作用:控制渲染引擎“何時”、“如何”將子Shader 內容進行呈現
渲染類型:
Tags { “RenderType”=“Opaque” } ?//渲染輸出的是非透明物體
Tags { “RenderType”=“Transparent” } //渲染輸出的是透明物體
渲染順序隊列:
Tags { “Queue” = “Transparent” } //指定在渲染透明物體的順序隊列
2、細節層次LOD
LOD: Level of Detail
數字越大,細節越高,消耗越大
“LOD 100”是非常低的值,與VertexLit(頂點光照)Shader的LOD值相同
3、CGPROGRAM…ENDCG
標記CG 程序
實現語言為Microsoft 的HLSL 語言(大多數與NVIDIA 的CG語言相同)
4、#pragma
作用:指示編譯對應Shader 函數
#pragma vertex vert //函數名為vert 的Vertex Shader
#pragma fragment frag //函數名為frag的Fragment?Shader
5、sampler2D
sampler2D 是與紋理綁定的數據容器接口,為CG/HLSL 中2D貼圖的類型
相應還有sampler1D、sampler3D、samplerCUBE 等格式
注意:因為CG 程序需要訪問屬性( properties )的變量,CG程序中的變量必須使用和之前變量相同的名字進行聲明
6、include
作用:導入Unity 包含Shader 預定義的變量和函數的文件
#include “UnityCG.cginc” //導入Unity 通用CG 預定義文件
7、appdata與v2f
appdata : 輸入到Vertex Shader 的數據
v2f : 從Vertex Shader 輸出,輸入到Fragment Shader 的數據
“float4”定義一個四維浮點數向量,浮點數精度為32-bit
“: POSITION“是Shader參數的“語義”,表示這個為Vertex的空間坐標
“SV_POSITION”描述Vertex的像素位置
8、vert與frag
UnityObjectToClipPos() //將Vertex 的對象空間轉換為攝像機的剪裁空間(屏幕2D坐標)
“fixed4”定義一個四維浮點數向量,浮點數精度為11-bit,值域從-2.0到+2.0
“SV_Target”描述像素pixel → Color
“return fixed4(1,0,0,1)”表示最后frag返回的是純紅色的像素