Surface Shader
主要用來實現(xiàn)光照相關(guān)處理,可能更簡潔淤齐。
Vertex and Fragment Shader
如果不與光照交互, 則可以用這個shader袜匿,更錄活
fixed function shaders
固定shader主要用于老舊卡
ShaderLab
不管寫哪種shader,最終通過shaderLab實現(xiàn)更啄,其組織結(jié)構(gòu)如下:
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
}
}
開始以下學(xué)習(xí)前,先簡單了解一下shaderlab指南
======================================================================
ShaderLab 語法: Shader
語法:
Shader "名字" {[Properties] Subshaders [Fallback]}
[]--可選項目
Properties
Shader可以有多個屬性(properties),每一個屬性都顯示在Unity的inspector. 如顏色居灯,貼圖祭务,或者任意值
Subshaders & Fallback
每個shader包含多個子shader, 至少包含有一個。當(dāng)加載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)岩灭, 它開啟了頂點(diǎn)光拌倍,并設(shè)置基本材質(zhì)。
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 模式找爱,自動貼圖坐標(biāo)生成模式梗顺。可以為ObjectLnear, EyeLinear,Shperemap, CubeReflect,CubeNormal之一车摄。這些對應(yīng)于OpenGL中相應(yīng)的texgen模式寺谤。
ShaderLab 語法:SubShader
語法:
SubShader { [Tags] [CommonState] Passdef [Passdef ...] }
一個SubShader可以定義一組渲染通道,可選設(shè)置共同狀態(tài)針對所有通道吮播,也可以指定標(biāo)簽
當(dāng)Unity確實使用那個SubShader時变屁,它會用該Subshader每個通道一一給對象進(jìn)行渲染,每一次渲染是一個比較昂貴的操作意狠。盡可能的少用通道敞贡。
例子如下:
// ...
SubShader {
Pass {
Lighting Off
SetTexture [_MainTex] {}
}
}
// ...
ShaderLab 語法:Pass
語法:
Pass {[Name and Tasgs] [RenderSetup] [TextureSetup]}
基本通道命名包含一個可能的渲染設(shè)置命令。 以及接著一個可選的一組使用貼圖
Name and Tags
一個通道可能定義它的名字 和 任意個數(shù)標(biāo)簽(key/value隊摄职,用于進(jìn)行通道與引擎間交互)誊役。
Rander Setup
通道設(shè)置多個圖形硬件狀態(tài)获列,如打開alpha混合, 使用霧蛔垢。等等击孩, 命令如下:
Material
Material { Material Block}
定義一個用在頂點(diǎn)光照管線的材質(zhì)。 見【Material page】
Lighting
Lighting On | Off
打開|關(guān)閉頂點(diǎn)光照. 見【Material page】
Culling
Cull Back | Front | Off
設(shè)置多邊形揀選模式.見【 Cull and Depth page 】
ZTest
ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
設(shè)置深度檢測模式.見【 Cull and Depth page 】
ZWrite
ZWrite On | Off
設(shè)置深度寫模式.見【 Cull and Depth page 】
Fog
Fog {Fog Block}
設(shè)置霧參數(shù)鹏漆。見【Fog page 】
AlphaTest
AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
打開Alpha測試巩梢。見【Alpha Testing page】
Blend
Blend SourceBlendmMode DestBlendMode
設(shè)置混合模式。見【 Blending page】
Color
Color Color-value
在頂點(diǎn)光照打開時艺玲,選用的頂點(diǎn)顏色.見【Material page】
ColorMask
ColorMask RGB | A | 0 | any combinaion of R,G,B,A
設(shè)置顏色寫入mask, 0括蝠,表示關(guān)閉所有顏色通道寫入.見【Material page】
Offset
Offset OffsetFacotr, OffsetUnits
設(shè)置Z深度緩沖偏移.見【 Cull and Depth page 】
SeperateSpecular
SeperateSpecular On | Off
打開|關(guān)閉頂點(diǎn)光照的分隔高光.見【Material page】
ColorMaterail
ColoerMaterial AmbientAndDiffuse | Emission
使用每一個頂點(diǎn)光饭聚,當(dāng)在計算頂點(diǎn)光照時忌警。見【Material page】
Texture Setup
在渲染狀態(tài)設(shè)置后,你可能指定一定數(shù)量的貼圖和它們的組合模式秒梳,通過SetTexture進(jìn)行應(yīng)用
ShaderLab 語法:Color,Material,Lighting
材質(zhì)與光照參數(shù)用來控件內(nèi)建頂點(diǎn)光照法绵。頂點(diǎn)光照是標(biāo)準(zhǔn)的D3D/OPENGL光照模式,它為每個頂點(diǎn)逐一計算酪碘。Lighting On 打開頂點(diǎn)光照朋譬,光照受到Material block,ColorMaterail,SeperateSpecular命令影響。
像素光照通常用自定義vertex/fragment程序?qū)嵗丝眩皇怯庙旤c(diǎn)光照徙赢。 下訴命令在像素光照中無效。