写shader我们需要和unity提供的一种专门为unityshader服务的语言——ShaderLab。该语言是unity提供的渲染抽象层
一个unityshader基本结构如下
Shader"custom/myshader"{
Properties{
//属性
}
SubShader {
//显卡A使用的子着色器
}
SubShader {
//显卡B使用的子着色器
}
FallBack "VertexLit"
}
属性Properties
Properties {
// Numbers and Sliders
_Int ("Int", Int) = 2
_Float ("Float", Float) = 1.5
_Range("Range", Range(0.0, 5.0)) = 2.0
// Colors and Vectors
_Color ("Color", Color) = (1,1,1,1)
_Vector ("Vector", Vector) = (5, 3, 6, 1)
// Textures
_2D ("2D", 2D) = "" {}
_Cube ("Cube", Cube) = "white" {}
_3D ("3D", 3D) = "black" {}
}
声明这些属性是为了在材质面板中能够方便的调整材质属性,属性的名字通常有一个下划线开头,引号里面的是在材质面板显示的名字,对于int float range默认值是一个数字,对于color,vector是一个四维向量。2D,CUbe,3D这三种纹理类型默认值通过一字符串和花括号来制定,
以下是材质面板展示的属性
Subshader
每一个unityshader可以包含多个subshader,但至少有一个,unity会根据不同显卡显示不同的subshader,
基本结构:
SubShader {
Tags
Randersetup
Pass {
}
}
subshader中定义了一些可选的渲染状态和标签设置,meigepass定义了一次完整的渲染流程,pass过多渲染性能下降,
- 状态和标签也可以在pass中声明,不同的是subshader中一些标签设置时特定的
- 状态设置如果在subshader中设置,那将作用于所有的pass
- 渲染状态设置
渲染状态设置名称 | 指令 | 含义 |
---|---|---|
cull | back,front,off | 剔除模式背面。正面,关闭 |
ZTest | LessGreater,LEqual,GEqual,Equal,NotEqual,Always | 设置深度测试时使用的函数 |
ZWrite | On,Off | 开启关闭深度写入 |
Blend | SrcFactor DstFactor | 开启并设置混合模式 |
当subshader设置了上述渲染状态时,将会应用到所有pass,
- 标签
subshader的标签是一个键值对,
标签类型 | 含义 | eg |
---|---|---|
Queue | 控制渲染顺序 | Tags { "Queue" = "Geometry" } |
RenderType | 将shaders分类为多个预定义组,Unity可以运行时替换符合特定RenderType的所有Shader。 | Tags { "RenderType"="Opaque" } |
DisableBatching | 禁用批处理 | Tags { "RenderType"= “True” |
ForceNoShadowCasting | 强制无阴影投射 | Tags { "ForceNoShadowCasting"= “True” |
IgnoreProjector | 忽略投影 | Tags { "IgnoreProjector"= “True” |
CanUseSpriteAtlas | 可以使用Sprite图集 | Tags { "CanUseSpriteAtlas"= “True” |
PreviewType | 预览类型 | Tags { "PreviewType"= “Plane” |
Pass
结构如下:
Pass {
Name
Tags
RenderSetup
}
pass同样可使使用标签,
标签 | 含义 | eg |
---|---|---|
LightMode | 定义该pass在渲染流水线中的角色 | Tags { "LightMode"="ForwardBase" } |
RequireOptions | 指定满足某些条件执行该pass | Tags { "RequireOptions "="SoftVegetation" } |
Fallback
告诉unity、如果上述subshader都不能执行,那就执行这个低级的shader
点击关注我的微博,给大家带来欢乐