天天看點

U3D Shader筆記(1)UnityShader組織形式UniyShader的形态

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"
}
           

繼續閱讀