Unity Shader基础
-
材质和UnityShader同时使用,使用流程:
(1)创建一个材质; (2)创建一个Unity Shader,并把它赋给上一步创建的材质; (3)把材质赋给要渲染的对象; (4)在材质面板设置Unity Shader的属性。 -
Unity Shader 的基础:ShaderLab Unity Shader 是Unity为开发者提供的高级渲染抽象层,ShaderLab则是实现Unity Shader的语言。
-
Unity Shader 的简单结构:
Shader "ShaderName" { Properties { // 属性 } SubShader { // 显卡A使用的子着色器 } SubShader { // 显卡B使用的着色器 } Fallback "VertexLit" }
Unity Shader 包含 Properties、SubShader、 Pass、Fallback等语义块:
Properties语义:
Properties {
Name ("display name", PropertyType) = DefaultValue
Name ("display name", PropertyType) = DefaultValue
// ...
}
SubShader:
SubShader {
// 可选
[tags]
// 可选
[RenderSetup]
Pass {
}
// Other Pass
}
SubShader的标签:
Tags{ "TagName1" = "Value1" "TagName2"="value2" }
Pass:
Pass {
[Name]
[Tags]
[RenderSetup]
// other code
}
Fallback 留一条后路
Fallback "name"
// 或:
Fallback Off
- Unity Shader的形式:
(1)表面着色器(Surface Shader),Unity 自创 (2)顶点片元着色器(正当壮年) (3)固定函数着色器(淘汰了)
注意:表面着色器被定义在SubShader中,而不是pass.
示例: Surface Shader:
Shader "Custom/Simple Suface Shader" {
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float4 color:COLOR;
};
void surf(Input IN,inout SurfaceOutput o) {
o.Albedo = 1;
}
ENDCG
}
Fallback"Diffuse"
}
Vertex/Fragment: Shader"Custom/Simple VertexFragment Shader" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
float4 vert(float4 v:POSITION):SV_POSITION {
return mul(UNITY_MATRIX_MVP,v);
}
fixed4 frag():SV_Target {
return fixed(1.0,0.0,0.0,1.0);
}
ENDCG
}
}
}
固定函数着色器: Shader"Tutorial/Basic" { Properties { _Color("Main Color",Color) = (1,0.5,0,1.0) } SubShader { Pass { Material { Diffuse[_Color] } Lighting On } } }