0x01 基本语法
Shader "name" { [Properties] __Subshaders__ [Fallback] [CustomEditor] }
名字 |
解释 |
name |
Shader文件中name是唯一存在,且不能与其他shader文件重名 |
Properties |
属性表 |
Properties:属性表组成 及其 语法:Properties { Property [Property ...] }
variable |
Inspect ui name |
data type |
default value |
_Color |
"Color" |
Color |
(1,1,1,1) |
_TestVector |
"TestVector" |
vector |
(0.1,0.2,0.3) |
_MainTex |
"Albedo (RGB)" |
Texture 2D |
"white" {} |
_Glossiness |
"Smoothness" |
Range |
0.5 |
_TestFloat |
"TestFloat" |
float |
0.5 |
_TestInt |
"TestInt" |
int |
2 |
_TestCube |
"TestCube" |
CUBE |
""{} |
{
_Color ("Color", Color) = (1,1,1,1)//颜色指示器
_TestVector("TestVector", vector) = (0.1,0.2,0.3)//坐标
_MainTex ("Albedo (RGB)",2D)="white" {}//纹理带tilling xy与offset zw
_Glossiness("Smoothness", Range(0,1)) = 0.5//滑块
_TestFloat("TestFloat",float) = 0.5//单精度值
_TestInt("TestInt", int) = 2//整形
_TestCube("TestCube", CUBE) = ""{}//cube纹理
}
Properties属性映射到Subshaders(Cg/HLSL code)中的变量对应表
Property Type |
Subshader Type |
Color、Vector |
float4、half4、fixed4 |
Range、float |
float、half、fixed |
Texture |
sampler2D |
CUBE |
samplerCUBE |
3DTexture |
sampler3D |
属性前缀(可选属性)
Attribute |
Describe |
|
|
在inspector面板隐藏纹理平铺/偏移。 |
|
|
指示纹理属性需要一个法线映射 |
|
指示纹理属性需要高动态范围(HDR)纹理 |
指示在UI中将浮点数/向量属性指定为sRGB值(就像颜色一样),可能需要根据使用的颜色空间进行转换。 |
|
指示纹理属性用MaterialPropertyBlock每次渲染数据的形式呈现纹理 |
|
#pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY |
|
[Toggle] |
开关 |
[PowerSlider(3.0)]
|
非线性响应的滑块 |
[Space]…[Space(value)]
|
创建一个垂直空间 |
[Header(…)]
|
加标题文字说明 |
0x02 Subshader
Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
一个Shader可以有一组subshader。每个subshader可以设置标签、一组通道。
以下标签 只在subshader内部被识别,不能在pass内。
渲染队列Rendering Order
Name |
Base Order Value |
Describe |
Background |
1000 |
最先渲染,会被遮挡 |
Geometry |
2000 |
适用用于大多数不透明几何物体 |
AlphaTest |
2450 |
是阻止像素被写到屏幕的最后机会 |
Transparent |
3000 |
任何alpha混合(例如着色器不写入深度缓冲)都应该到这里(玻璃,粒子效果)。 |
Overlay |
4000 |
叠加效果,最后渲染,一般做后处理 |
着色器分类RenderType Tag
Name |
Describe |
Opaque |
大多数着色器(正常, 自动照明,反射,地形着色器等等) |
Transparent |
大多数半透明着色器(透明,粒子,字体,地形添加通过着色器) |
TransparentCutout |
masked transparency例如一片有洞的树叶、打碎了的玻璃窗 |
Background |
Skybox |
Overlay |
UI、Halo、Flare |
TreeOpaque |
Terrain engine tree bark |
TreeTransparentCutout |
Terrain engine tree leaves |
TreeBillboard |
Terrain engine billboarded trees |
Grass |
Terrain engine grass |
GrassBillboard |
Terrain engine billboarded grass |
备注: 现在有了SpeedTree第三方插件,可以很好的替换上Terrain engine关于树花草等
0x03 Pass
Pass { [Name and Tags] [RenderSetup] }
Name “PassName” 与 UsePass “shaderName/passName“
光照标签:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }光照标签只能在Pass内识别
Lighting Mode |
Descripe |
Always |
总是开启渲染,没有光照计算 |
ForwardBase |
Used in Forward rendering. 该pss会计算环境光、主方向光、逐顶点/SH lighting以及光照贴图 |
ForwardAdd |
Used in Forward rendering,该pass会计算额外的逐像素光,每个pass对应一个光源 |
Deferred |
Used in Deferred Shading, 该pass会渲染g-buffer |
ShadowCaster |
把物体的深度信息渲染到阴影纹理或一张深度纹理 |
MotionVectors |
Used to calculate per-object motion vectors |
PrepassBase |
(Legacy)Deferred Lighting,该pass渲染法线和高光反射的指数部分 |
PrepassFinal |
legacy Deferred Lighting,通过合并纹理、灯光、散射光渲染最终颜色 |
Vertex |
Used in legacy Vertex Lit rendering when object is not lightmapped顶点着色 |
VertexLMRGBM |
Used in legacy Vertex Lit rendering when object is lightmapped;顶点着色 |
VertexLM |
Used in legacy Vertex Lit rendering when object is lightmapped顶点着色 |
PassFlags
OnlyDirectional指示该Pass只接受main directional light and ambient/lightprobe data。
RequireOptions
SoftVegetation指示该Pass只应用于软植被
Render state set-up //渲染状态
0x04 Culling & Depth Testing & Blending& Stenci详解
0x05 Render Pipeline & 光照渲染路径
0x100待续
keyword变种知识补充