1. 程式人生 > >【Unity Shaders】學習筆記之Shader簡介(一)

【Unity Shaders】學習筆記之Shader簡介(一)

一、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語法結構

Shader 著色器名稱(使用/做選單分隔符)
{
Properties{
屬性
}
SubShader{
Pass{…}
}
Fallback “Diffuse”
}


3.2屬性

語法:_Name("Display Name", type) = defaultValue[{options}]
Properties塊內的語法都是單行的
屬性型別如下表格:


1.對於Range和Float型別的屬性只能是單精度值 
2.對於Color和Vector型別的屬性將包含4個由括號圍住的數描述
3.對於紋理(2D, Rect, Cube) 預設值既可以是一個空字串也可以是某個內建的預設紋理:"white", "black", "gray" or"bump"
4.隨後在著色器中,屬性值通過[name]來訪問
5.{option}是可選的,對2D、Rect、Cube貼圖有關,在寫輸入時最少要在貼圖之後寫一對空白{},當需要開啟特定選項時可以把選項寫在這對花括號內