注: ShaderLabCommands在《Unity入门精要中》写成RenderSetup即渲染设置 但最新(2020.3)的官方文档中写的是Commands,所以我还是按照官方文档的为准 官方文档: https://docs.unity3d.com/Manual/shader-shaderlab-commands.html

大部分渲染器命令Commands可用写在pass内,也可以写在pass外(两者主要是作用域的区别)

  1. SubShader
  2. {
  3. Tags{ }
  4. LOD 100
  5. //ShaderLabCommands
  6. AlphaToMask off
  7. pass
  8. {
  9. //ShaderLabCommands
  10. AlphaToMask on
  11. }
  12. }

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’】
  1. //示例:
  2. Blend DstColor SrcColor
  3. BlendOp Add
  4. //表示含义
  5. // Out = SrcColor * DstColor + DstColor * SrcColor
  6. // 语法: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
  1. //Blend 基本组合
  2. Blend SrcAlpha OneMinusSrcAlpha // 传统透明度(正常模式)
  3. Blend One OneMinusSrcAlpha // 预乘透明度
  4. Blend One One // 加法(线性减淡)
  5. Blend OneMinusDstColor One // 软加法(柔和相加)
  6. Blend DstColor Zero // 乘法(正片叠底)
  7. 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 混合不兼容。

  1. Blend One One
  2. 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)