U3D Shader筆記(1)UnityShader組織形式
UniyShader的形态
surface shaders
vertex and fragment shaders
fixed function shaders
Shaderlab基本結構
shader "name"{
[Properties]
SubShaders
[FallBack]
}
Properties
可以在材質監視面闆上顯示的屬性
_Name(“Display Name”, type) = defaultBalue[{options}]
_Name
屬性的名字,簡單說就是變量名,在之後整個Shader代碼中将使用這個名字來擷取該屬性的内容
Display Name
這個字元串将顯示在Unity的材質編輯器中作為Shader的使用者可讀的内容
type
這個屬性的類型,可能的type所表示的内容有以下幾種
COLOR | 顔色,由RGBA(紅綠藍和透明度)四個量來定義 |
---|---|
2D | 一張2的階數大小(256,512之類)的貼圖。這張貼圖将在采樣後被轉為對應基于模型UV的每個像素的顔色,最終被顯示出來 |
Cube | 即Cube map texture(立方體紋理),簡單說就是6張有聯系的2D貼圖的組合,主要用來做反射效果(比如天空盒和動态反射),也會被轉換為對應點的采樣 |
Rect | 一個非2階數大小的貼圖 |
Range(min, max) | 一個介于最小值和最大值之間的浮點數,一般用來當作調整Shader某些特性的參數(比如透明度渲染的截止值可以是從0至1的值等) |
Float | 任意一個浮點數 |
Vector | 一個四維數 |
defaultValue
定義了這個屬性的預設值,通過輸入一個符合格式的預設值來指定對應屬性的初始值(某些效果可能需要某些特定的參數值來達到需要的效果,雖然這些值可以在之後在進行調整,但是如果預設就指定為想要的值的話就省去了一個個調整的時間,友善很多)
COLOR | 以0~1定義的rgba顔色,比如(1,1,1,1) |
---|---|
2D,Rect,Cube | 對于貼圖來說,預設值可以為一個代表預設tint顔色的字元串,可以是空字元串或者"white",“black”,“gray”,"bump"中的一個 |
Float ,Range(min, max) | 某個指定的浮點數 |
Vector | 一個4維數,寫為 (x,y,z,w) |
{option}
它隻對2D,Rect或者Cube貼圖有關,在寫輸入時我們最少要在貼圖之後寫一對什麼都不含的空白的{},當我們需要打開特定選項時可以把其寫在這對花括号内。如果需要同時打開多個選項,可以使用空白分隔。可能的選擇有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一個,這些都是OpenGL中TexGen的模式
屬性案例代碼:
Properties { Property [Property …] }
定義屬性塊,其中可包含多個屬性,其定義如下:
name (“display name”, Range (min, max)) =number
定義浮點數屬性,在檢視器中可通過一個标注最大最小值的滑條來修改。
name (“display name”, Color) =(number,number,number,number)
定義顔色屬性
name (“display name”, 2D) = “name” {options }
定義2D紋理屬性
name (“display name”, Rect) = “name”{ options }
定義長方形(非2次方)紋理屬性
name (“display name”, Cube) = “name”{ options }
定義立方貼圖紋理屬性
name (“display name”, Float) = number
定義浮點數屬性
name (“display name”, Vector) =(number,number,number,number)
定義一個四元素的容器(相當于Vector4)屬性
SubShader
為GPU編寫的shder片段,可以有并必須有一個subshader,當有多個subshader顯示卡會選擇一個subshader執行。由于硬體不同,是以會有多個subshader,當這個shader檔案執行時會按順序檢測每個subshader是否能被良好的執行,如果可以則執行這個subshader,如果不能則檢測下一個。
FallBack
如果我們定義的subshader在目前硬體都無法執行,則執行fallback所制定的着色器,往往時系統的比較簡單的。
Unlit | 不發光。隻是一個紋理,不被任何光照影響 |
---|---|
VertexLit | 頂點光照 |
Diffuse | 漫發射 |
Normal mapped | 法線貼圖,比漫反射更加昂貴:增加了一個或多個紋理(法線貼圖)和幾個着色器結構 |
Specular | 高光。增加了高光計算 |
Normal Mapped Specular | 高光法線貼圖。比高光昂貴一點 |
Parallax Normal mapped | 視差法線貼圖。增加了視差法線貼圖計算 |
Parallax Normal Mapped Specular | 視差高光法線貼圖。增加了視差法線貼圖和鏡面高光計算 |
Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", float) = 0.0
}
SubShader {
}
FallBack "Diffuse"
}