一、Shader簡介
Shader(着色器)實際上就是一小段程序,它負責將輸入的Mesh(網格)以指定的方式和輸入的貼圖或者顏色等組合作用,然後輸出。繪圖單元可以依據這個輸出將圖像繪製到屏幕上。輸入的貼圖或者顏色等,加上對應的Shader,以及對Shader的特定的參數設置,將這些內容(Shader及輸入參數)打包存儲在一起,得到的就是一個Material(材質)。之後,我們便可以將材質賦予合適的renderer(渲染器)來進行渲染(輸出)了是一段規定好輸入(顏色,貼圖等)和輸出(渲染器能夠讀懂的點和顏色的對應關係)的程序。而Shader開發者要做的就是根據輸入,進行計算變換,產生輸出
先看看着色器能幹什麼file:///C:/Program%20Files/Unity/Editor/Data/Documentation/en/Manual/index.html,搜索Surface Shader ExamplesUnity中已經內置了一些Shader可以直接使用,會隨程序一起安裝支持自定義shader,也可以在內置shader的基礎上進行修改。
二、着色器
2.1着色器類型
計算機圖形學的渲染管線一般可以分爲兩種類型:
- 固定功能渲染管線(fixed-functionrendering pipelines)
- 可編程渲染管線(programmablerendering pipelines)
Unity支持三種類型的shader:
- 固定功能着色器(Fixed Function Shaders),完全使用ShaderLab編寫
- 表面着色器(Surface Shaders),關鍵代碼使用Cg/HLSL語言編寫
- 頂點片段着色器(Vertex And Fragment Shaders),它包括頂點程序(Vertex Programs)和片段程序(fragment Programs),使用Cg/HLSL來編寫核心的實現代碼
固定功能着色器便是我們所說的固定功能渲染管線(fixed-functionrendering pipelines)的具體表現,而表面着色器、頂點着色器以及片段着色器便屬於可編程渲染管線,固定功能着色器可以說是Unity爲Shader的書寫自帶的一層殼,Unity已經在內部爲我們做了大量的工作,我們只要稍微記住一些關鍵字、一些規範就可以實現出很多不錯的效果。
表面着色器這個概念更多的只是在Unity中聽說,可以說是Unity自己發揚光大的一項使Shader的書寫門檻降低和更易用的技術。
頂點着色器:產生紋理座標,顏色,點大小,霧座標,然後把它們傳遞給裁剪階段。
片段着色器:進行紋理查找,決定什麼時候執行紋理查找,是否進行紋理查找,及把什麼作爲紋理座標。
2.1着色器語言區分
固定功能着色器:沒有嵌套CG語言,也就是代碼段中沒有CGPROGARAM和ENDCG關鍵字的
表面着色器:嵌套了CG語言,代碼段中有surf函數的
頂點着色器&片段着色器:嵌套了CG語言,代碼段中有#pragma vertex name和 #pragma fragment frag聲明的
三、ShaderLab簡介
Unity中Shader編程的語言HLSL:高階着色器語言(High Level Shader Language,簡稱HLSL),由微軟擁有及開發的一種語言,HLSL 獨立的工作在 Windows 平臺上,只能供微軟的Direct3D使用。 HLSL是微軟抗衡GLSL的產品,同時不能與OpenGL標準兼容CG:即C for graphics,是微軟Microsoft和英偉達NVIDIA相互協作在標準硬件光照語言的語法和語義上達成的一種一致性協議。Microsoft和NVIDIA聯手推出CG語言,想在經濟和技術上實現雙贏,從而通過這種方式聯手打擊他們共同的對手GLSL。
官方網站:https://developer.nvidia.com/cg-toolkit
用HLSL寫的代碼可以直接當作Cg代碼使用,CG語言又約等於HLSL語言。即,在Unity中寫Shader就是用CG/HLSL寫Shader,也就約等於給DirectX寫Shader。
3.1語法結構
3.2屬性
語法:_Name("Display Name", type) = defaultValue[{options}]
Properties塊內的語法都是單行的
屬性類型如下表格:
2.對於Color和Vector類型的屬性將包含4個由括號圍住的數描述
3.對於紋理(2D, Rect, Cube) 缺省值既可以是一個空字符串也可以是某個內置的缺省紋理:"white", "black", "gray" or"bump"
4.隨後在着色器中,屬性值通過[name]來訪問
5.{option}是可選的,對2D、Rect、Cube貼圖有關,在寫輸入時最少要在貼圖之後寫一對空白{},當需要打開特定選項時可以把選項寫在這對花括號內