注: ShaderLabCommands在《Unity入门精要中》写成RenderSetup即渲染设置 但最新(2020.3)的官方文档中写的是Commands,所以我还是按照官方文档的为准 官方文档: https://docs.unity3d.com/Manual/shader-shaderlab-commands.html
大部分渲染器命令Commands可用写在pass内,也可以写在pass外(两者主要是作用域的区别)
SubShader
{
Tags{ }
LOD 100
//ShaderLabCommands
AlphaToMask off
pass
{
//ShaderLabCommands
AlphaToMask on
}
}
Commands表
命令 | 参数 | 说明 | |
---|---|---|---|
Cull | 剔除 | off Back(默认) Front |
关闭剔除 背面剔除 正面剔除 |
Name | 通道命名 | [string] // “HibariPass” //pass的名称,一段自定义字符串 //要写在pass外 |
|
UsePass | 使用现成通道 | [string] // “ShaderFile/HibariShader/HibariPass” //shader所在标签地址+pass通道名称 //一段自定义字符串 //要写在pass内 |
|
Blend | 混合命令 | off [因子值A] [因子值B] |
关闭混合 |
BlendOp | 运算方式 | 见表 | 注:必须配合Blend使用,且通常Blend //Blend One One //BlendOp Add ⚠️注意: BlendOp表示的是两个Blend因子的附加运算方式 |
GrabPass | 抓取缓冲区纹理 | [string] //gran pass{“TextureName”} // 从缓冲区抓取内容,并保存命名为 // “TextureName”纹理 // 在后续同一帧中的SubShader中 // 可以使用该纹理 |
|
Ztest | 深度测试 | Less LEqual(默认) Equal GEqual Greater NotEqual Always |
绘制位于现有几何体前面的几何体。不绘制位于现有几何体相同距离或后面的几何体。 绘制位于现有几何体前面或相同距离的几何体。不绘制位于现有几何体后面的几何体。 绘制位于现有几何体相同距离的几何体。不绘制位于现有几何体前面的或后面的几何体。 绘制位于现有几何体后面或相同距离的几何体。不绘制位于现有几何体前面的几何体。 绘制位于现有几何体后面的几何体。不绘制位于现有几何体相同距离或前面的几何体。 绘制不位于现有几何体相同距离的几何体。不绘制位于现有几何体相同距离的几何体。 不进行深度测试。绘制所有几何体,无论距离如何。 |
ZWrite | 更新深度缓冲区 | Off on |
用于正确排序物体 通常不透明物体开启,半透明物体关闭 |
ZClip | 深度剪辑模式 | Ture False |
|
AlphaToMask | off on |
注:用来打开或关闭alpha-to-coverage 常用在树叶草地等带Alpha通道的地方 必须与抗锯齿MSAA一起使用 |
|
ColorMask | 通道写入 | 0 RGBA |
写入全部通道 写入R、G、B、A通道 (RGBA可任意组合,不用空格) 注:不开启写入的表示禁用不修改该通道 |
Conservative | 保守光栅化 | True flase |
注:将矢量数据的三角形转换为像素三角形 会产生非常多的可用片元,但会加大GPU消耗 |
Offset | 深度偏移 | [factor] [units] | 注: [factor]:深度斜率 -1~1的浮点值 [units]:-1~1的浮点值 缩放最小可分辨深度缓冲值,产生恒定偏移 赋值表示多边形更靠近 |
Stencil | 模板 | Stencil { Ref ReadMask WriteMask Comp Pass Fail ZFail CompBack PassBack FailBack ZFailBack CompFront PassFront FailFront ZFailFront } //通过模板测试的片元会继续渲染,没有通过的会被剔除 //注:与模板测试、模板缓冲区有关 具体见文档https://docs.unity3d.com/cn/2020.3/Manual/SL-Stencil.html |
|
Fog | ShaderLab旧版功能 | ||
Material { } | |||
AlphaText | |||
SetTexture | |||
BindChannels |
基础知识
缓冲区
模板缓冲区
自定义条件的剔除关系 (通过stencil模板测试实现)
深度缓冲区
用来记录每个像素的深度值,用来确定遮挡关系 (通过Ztest实现深度测试、ZWrite实现深度写入)
颜色缓冲区(帧缓冲区)
所有的物体都会渲染到帧缓冲区,最后合成输出到平面 (帧缓冲区是渲染输出的最后一步)
混合模式
ZTest 决定遮挡关系 AlphaTest 检查Alpha是否达到显示条件(要么完全剔除,要么完全暴露) Blend决定最后通过测试的如何混合
Blend 混合命令
做Blend混合需要2个颜色进行混合
当前源:SourceValue 当前Shader片元着色器渲染出来的片元 SrcColor:片元的RGB颜色 SrcAlpha:片元的Alpha通道
帧缓冲区目标:DestinationValue 其他Shader渲染好,并保存到帧缓冲区保存的颜色 DstColor:缓冲区RGB颜色 DstAlpha:缓冲区Alpha通道
Blend 指令内部运行过程 | Outrgb = SrcColor 【FactorA】 【Op】 DstColor 【FactorB】 Outa = SrcAlpha 【FactorA’】 【Op】 DstAlpha 【FactorB’】 |
---|---|
【Op】是运算方式,通过BlendOp命令指定(默认是Add) BlendOp 【Op】 【Factor】是因子值,通过Blend命令指定 Blend 【FactorA】【FactorB】 Blend 【FactorA】【FactorB】,【FactorA’】 【FactorB’】 |
//示例:
Blend DstColor SrcColor
BlendOp Add
//表示含义
// Out = SrcColor * DstColor + DstColor * SrcColor
// 语法:Out = SrcColor * 【FactorA】 【Op】 DstColor * 【FactorB】
因子值表
关键字 | 说明 | 关键字 | 说明 |
---|---|---|---|
因子值 Factor | 值 | 反向因子值 OneMinus Factor | 值 |
SrcColor | 当前源通道的RGB值(源RGB) | OneMinusSrcColor | 当前源通道的RGB反向值(1-源RGB) |
SrcAlpha | 当前源的A通道值(源A) | OneMinusSrcAlpha | 当前源的A通道反向值(1-源A) |
DstColor | 帧缓冲区目标的RGB值(目标RGB) | OneMinusDstColor | 帧缓冲区目标的RGB反向值(1-目标RGB) |
DstAlpha | 帧缓冲区目标的A通道值(目标A) | OneMinusDstAlpha | 帧缓冲区目标的A通道反向值(1-目标A) |
One | 1 | Zero | 1 |
//Blend 基本组合
Blend SrcAlpha OneMinusSrcAlpha // 传统透明度(正常模式)
Blend One OneMinusSrcAlpha // 预乘透明度
Blend One One // 加法(线性减淡)
Blend OneMinusDstColor One // 软加法(柔和相加)
Blend DstColor Zero // 乘法(正片叠底)
Blend DstColor SrcColor // 2x 乘法(两倍相乘)
BlendOp 运算方式(操作方式)
BlendOp相当于用符号表示的运算符 注意: 1.在 OpenGL ES 2 上,Min 和 Max 需要GL_EXT_blend_minmax。 2.逻辑操作需要 DX 11.1+ 或 Vulkan。 3.高级 OpenGL 混合操作需要 GLES3.1 AEP+、GL_KHR_blend_equation_advanced 或 GL_NV_blend_equation_advanced。 它们只能与标准 RGBA 混合一起使用; 与单独的 RGB 和 Alpha 混合不兼容。
Blend One One
BlendOp Add
值 | 运算方式 | 功能 |
---|---|---|
Add (默认) | A+B | 将源和目标相加。 |
Sub | A-B | 从源减去目标。 |
RevSub | B-A | 从目标减去源。 |
Min | min(源RGBA,目标RGBA) | 使用源和目标中的较小者。(参见注释 1) |
Max | max(源RGBA,目标RGBA) | 使用源和目标中的较大者。(参见注释 1) |
LogicalClear | 逻辑操作:Clear (0)(参见注释 2) | |
LogicalSet | 逻辑操作:Set (1)(参见注释 2) | |
LogicalCopy | 逻辑操作:Copy (s)(参见注释 2) | |
LogicalCopyInverted | 逻辑操作:Copy inverted (!s) 2 | |
LogicalNoop | 逻辑操作:Noop (d)(参见注释 2) | |
LogicalInvert | 逻辑操作:Invert (!d)(参见注释 2) | |
LogicalAnd | 逻辑操作:And (s & d)(参见注释 2) | |
LogicalNand | 逻辑操作:Nand !(s & d)(参见注释 2) | |
LogicalOr | Logical operation: Or (s | d) (See note 2) | |
LogicalNor | Logical operation: Nor !(s | d) (See note 2) | |
LogicalXor | 逻辑操作:Xor (s ^ d)(参见注释 2) | |
LogicalEquiv | 逻辑操作:Equivalence !(s ^ d)(参见注释 2) | |
LogicalAndReverse | 逻辑操作:Reverse And (s & !d)(参见注释 2) | |
LogicalAndInverted | 逻辑操作:Inverted And (!s & d)(参见注释 2) | |
LogicalOrReverse | Logical operation: Reverse Or (s | !d) (See note 2) | |
LogicalOrInverted | Logical operation: Inverted Or (!s | d) (See note 2) | |
Multiply | 高级 OpenGL 混合操作: Multiply(参见注释 3) | |
Screen | 高级 OpenGL 混合操作: Screen(参见注释 3) | |
Overlay | 高级 OpenGL 混合操作: Overlay(参见注释 3) | |
Darken | 高级 OpenGL 混合操作: Darken(参见注释 3) | |
Lighten | 高级 OpenGL 混合操作: Lighten(参见注释 3) | |
ColorDodge | 高级 OpenGL 混合操作: ColorDodge(参见注释 3) | |
ColorBurn | 高级 OpenGL 混合操作: ColorBurn(参见注释 3) | |
HardLight | 高级 OpenGL 混合操作: HardLight(参见注释 3) | |
SoftLight | 高级 OpenGL 混合操作: SoftLight(参见注释 3) | |
Difference | 高级 OpenGL 混合操作: Difference(参见注释 3) | |
Exclusion | 高级 OpenGL 混合操作: Exclusion(参见注释 3) | |
HSLHue | 高级 OpenGL 混合操作: HSLHue(参见注释 3) | |
HSLSaturation | 高级 OpenGL 混合操作: HSLSaturation(参见注释 3) | |
HSLColor | 高级 OpenGL 混合操作: HSLColor(参见注释 3) | |
HSLLuminosity | 高级 OpenGL 混合操作: HSLLuminosity(参见注释 3) |
混合模式表
混合模式 | 命令 | 运算过程 |
---|---|---|
传统透明度(正常混合) Normal |
Blend SrcAlpha OneMinusSrcAlpha | 源RGB源A + (1-源A)目标RGB |
软加法(滤色、柔和相加) Screen |
Blend OneMinusDstColor One | 源RGB(1-目标RGB) +目标RGB1 |
软加法(滤色、柔和相加) Screen |
Blend One OneMinusSrcColor | |
相乘(正片叠底) Multiply |
Blend DstColor Zero | 源RGB目标RGB + 目标RGB0 |
相乘(正片叠底) Multiply |
Blend Zero SrcAlpha | 源RGB0 + 目标RGB源RGB |
2x乘法(2倍相乘) 2xMultiply |
Blend DstColor SrcColor | 源RGB目标RGB + 目标RGB源RGB |
线性减淡 Linear Dodge |
Blend One One | 源RGB1 + 目标RGB1 |
预乘透明度 |
Blend One OneMinusSrcAlpha | 源RGB*1 +(1-源A) |
减法混合 | Blend SrcAlpha One BlendOp Revsub |
源RGB(1-源A)- 目标1 |
变暗 Darken |
Blend One One BlendOp Min |
min(源RGB, 目标RGB) + min(源RGB, 目标RGB) |
变亮 Lighten |
Blend One One BlendOp Max |
max(源RGB, 目标RGB) + min(源RGB, 目标RGB) |