Unity3d Shader 預覽
Surface Shader
主要用來實現光照相關處理,可能更簡潔。
Vertex and Fragment Shader
如果不與光照交互, 則可以用這個shader,更錄活
fixed function shaders
固定shader主要用於老舊卡
ShaderLab
不管寫哪種shader,最終通過shaderLab實現,其組織結構如下:
Shader "MyShader" {
Properties{
_MyTexture ("My Texture",2D) = "white" {}
// other properties like colors or vectors go here as well
}
SubShader{
// here goes the 'meat' of your
// - surface shader or
// -vertex and fragment shader or
// -fixed function shader
}
SubShader{
// here goes a simpler version of the subshader above that can run older graphic cards
}
}
開始以下學習前,先簡單了解一下shaderlab指南
======================================================================
ShaderLab 語法: Shader
語法:
Shader "名字" {[Properties] Subshaders [Fallback]}
[]--可選項目
Properties
Shader可以有多個屬性(properties),每一個屬性都顯示在Unity的inspector. 如顏色,貼圖,或者任意值
Subshaders & Fallback
每個shader包含多個子shader, 至少包含有一個。當加載shader時, Unity會遍歷所有子shader.從上往下選擇第一個可以支持的。 如果沒有可以支持的, Unity會試着用Fallback shader.
如下就是一個最簡單的shader
// colored vertex lighting
Shader "Simple colored lighting" {
// a signle color property
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// define one subshader
SubShader{
Pass {
Material{
Diffuse [_Color]
}
Lighting On
}
}
}
subshader中包含了一個通道(Pass), 它開啟了頂點光,並設置基本材質。
ShaderLab 語法:Properties
語法:
Properties {Property [Property ...] }
定義 屬性塊,位於括號中的定義如下:
Float Range
name ("diplay name", Range(min, max)) = number
Color
name ("diplay name", Color) = (number, number, number, number)
Texture 2D
name ("diplay name", 2D) = "name" { options }
Rectangle
name ("diplay name", Rect) = "name" { options }
Cubemap
name ("display name", Cube) = "name" {options}
Float
name ("display name", Float) = number
Vector
name ("display name", Vector) = (number, number, number, number)
例子如下:
Properties {
// properties for water shader
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
貼圖選項
貼圖屬性的選項位花括號中,是可選的,可選項目如下:
1.TexGen 模式,自動貼圖坐標生成模式。可以為ObjectLnear, EyeLinear,Shperemap, CubeReflect,CubeNormal之一。這些對應於OpenGL中相應的texgen模式。
ShaderLab 語法:SubShader
語法:
SubShader { [Tags] [CommonState] Passdef [Passdef ...] }
一個SubShader可以定義一組渲染通道,可選設置共同狀態針對所有通道,也可以指定標簽
當Unity確實使用那個SubShader時,它會用該Subshader每個通道一一給對象進行渲染,每一次渲染是一個比較昂貴的操作。盡可能的少用通道。
例子如下:
// ...
SubShader {
Pass {
Lighting Off
SetTexture [_MainTex] {}
}
}
// ...
ShaderLab 語法:Pass
語法:
Pass {[Name and Tasgs\] [RenderSetup\] [TextureSetup]}
基本通道命名包含一個可能的渲染設置命令。 以及接着一個可選的一組使用貼圖
Name and Tags
一個通道可能定義它的名字 和 任意個數標簽(key/value隊,用於進行通道與引擎間交互)。
Rander Setup
通道設置多個圖形硬件狀態,如打開alpha混合, 使用霧。等等, 命令如下:
Material
Material { Material Block}
定義一個用在頂點光照管線的材質。 見【Material page】
Lighting
Lighting On | Off
打開|關閉頂點光照. 見【Material page】
Culling
Cull Back | Front | Off
設置多邊形揀選模式.見【 Cull and Depth page 】
ZTest
ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
設置深度檢測模式.見【 Cull and Depth page 】
ZWrite
ZWrite On | Off
設置深度寫模式.見【 Cull and Depth page 】
Fog
Fog {Fog Block}
設置霧參數。見【Fog page 】
AlphaTest
AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
打開Alpha測試。見【Alpha Testing page】
Blend
Blend SourceBlendmMode DestBlendMode
設置混合模式。見【 Blending page】
Color
Color Color-value
在頂點光照打開時,選用的頂點顏色.見【Material page】
ColorMask
ColorMask RGB | A | 0 | any combinaion of R,G,B,A
設置顏色寫入mask, 0,表示關閉所有顏色通道寫入.見【Material page】
Offset
Offset OffsetFacotr, OffsetUnits
設置Z深度緩沖偏移.見【 Cull and Depth page 】
SeperateSpecular
SeperateSpecular On | Off
打開|關閉頂點光照的分隔高光.見【Material page】
ColorMaterail
ColoerMaterial AmbientAndDiffuse | Emission
使用每一個頂點光,當在計算頂點光照時。見【Material page】
Texture Setup
在渲染狀態設置后,你可能指定一定數量的貼圖和它們的組合模式,通過SetTexture進行應用
ShaderLab 語法:Color,Material,Lighting
材質與光照參數用來控件內建頂點光照。頂點光照是標准的D3D/OPENGL光照模式,它為每個頂點逐一計算。Lighting On 打開頂點光照,光照受到Material block,ColorMaterail,SeperateSpecular命令影響。
像素光照通常用自定義vertex/fragment程序實例,而不是用頂點光照。 下訴命令在像素光照中無效。