混合指令

混合指令以 Blend 关键词开始,后面接混合模式。它可以在 Subshader 中使用,也可以在 Pass 中使用。

  • 在 SubShader 中使用会影响到 SubShader 中的所有 pass

  • 在 Pass 中使用只会对当前 Pass 起作用。

  • 混合命令开启后,会禁用 GPU 上的一些优化(主要是隐藏表面/去除 Early-Z),这会使GPU 帧时间增加

  • 默认操作符是 Add。

  • 单独的 RGB 和 Alpha 混合与高级 OpenGL 混合操作不兼容

[!NOTE] 参数解释

  • Src: 该片元产生的颜色 Source(源颜色)
  • Dst: 已经存在于颜色缓存的颜色被称为 Destination(目标颜色)
  • SrcFactor :源颜色的混合因子
  • Dst Factor :目标颜色的混合因子

可用的混合模式如下:

  1. Blend Off:关闭混合处理,当 Shader 中没有添加任何混合指令的时候,默认就是关闭状态。

  2. BlendSrcFactor DstFactor:开启混合处理,允许自定义混合模式。源颜色和目标颜色按照如下公式进行颜色混合:$Color_{rgba}=Source_{rgba}·SrcFactor+Destination_{rgba}·DstFactor$

  3. Blend SrcFactor DstFactor,SrcFactorA DstFactorA:跟上述指令类似,但是对于源颜色和目标颜色的 alpha 通道分别使用 SrcFactorA 和 DstFactorA 进行混合
    $Color_{rgb}=Source_{rgb}·SrcFactor+Destination_{rgb}·DstFactor$
    $Color_a=Source_a·SrcFactorA+Destination_a·DstFactorA$
    例如:我们想要在混合后,输出颜色的透明度值就是源颜色的透明度,可以使用以下命令:Blend SrcAlpha OneMinusSrcAlpha, One Zero

混合因子

[!quote] Title
Direct3D 现在支持通过逻辑运算符对目标颜色进行混合,体替代了上届描述的传统混合方程。不能同时使用传统混合方程和逻辑运算符这两种混合手段。当混合操作中使用了逻辑操作的时候,混合因子则不会被计算。

Pasted image 20230620134604

Unity 还提供了一些常用的混合指令:
Pasted image 20230620134620

混合操作

默认混合操作为 Add,我们可以使用混合操作命令进行其他混合操作:

  1. BlendOp Op:使用其他混合操作进行颜色混合,而不再只是进行颜色相加。
  2. BlendOpOpColor,OpAlpha:跟上述指令类似,但是对于颜色和 alpha 通道分别使用 OpColor 和 OpAlpha 不同的操作。
    Pasted image 20230620224119
    Pasted image 20230620224126

混合操作命令通常是与混合因子命令一起工作的。但需要注意的是,当使用 Min 或 Max 混合操作时,混合因子实际上是不起任何作用的,它们仅会判断原始的源颜色和目标颜色之间的比较结果。

常见的混合类型

Pasted image 20230620224434

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//正常( Normal ),即透明度混合
//不设置BlendOp则默认为Add
Blend SrcAlpha OneMinusSrcAlpha

//柔和相加( soft Additive )
Blend OneMinusDstColor One

//正片叠底( Multiply ),即相乘
Blend Dstcolor Zero

//两倍相乘( 2x Multiply )
Blend DstColor SrcColor

//变暗( Darken )
BlendOp Min
Blend One One

//变亮( Lighten )
BlendOp Max
Blend One One

//滤色( Screen )
Blend OneMinusDstColor One

//等同于
Blend One OneMinussrccolor

//线性减淡( Linear Dodge )
Blend One One

混合面板编辑

Pasted image 20230621100730**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Properties  
{
_BaseColor("Color", Color) = (1.0,1.0,1.0,1.0)

[Enum(UnityEngine.Rendering.BlendOp)]
_BlendOp("混合操作",int) = 0
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendSrc("源颜色的混合因子",int) = 5
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendOst("目标颜色的混合因子",int) = 10

[Enum(Off,0,On,1)] _Zwrite("ZWrite",int) = 0
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
}

Pass
{
......
BlendOp [_BlendOp] //可自定义混合运算符
Blend [_BlendSrc] [_BlendOst] //可自定义混合模式
ZWrite [_Zwrite] //可自定义是否写入深度缓冲区
}
}

Unity 线性空间 UI 的问题

(35条消息) Unity线性空间UI的问题_unity 线性空间_zhjzhjxzhl的博客-CSDN博客
https://www.jianshu.com/p/b93ef4b3453e
2023 Unity 技术开放日北京站-游戏专场:从手游到 VR ——《Pico 视频》渲染管线优化经验分享_哔哩哔哩_bilibili

剔除 Culling

clip

clip 函数会将参数小于 0 直接在片元着色器直接丢弃,常用于制作溶解,裁剪等效果**。
void clip (float4 x); void clip (float3 x); void clip (float2 x); void clip (float1 x); void clip (float x);
给定参数任何一个分量是负数,就舍弃当前像素的输出颜色

clip 函数等同于一下代码:

1
2
3
4
5
void clip (float4)
{
if ((any<0))
discard;
}

Cull

默认情况下,引擎提出了物体背面(相对于摄像机方向)的渲染图元,而之渲染物体正面。可以使用 Cull 指令来控制需要剔除哪个面的渲染图元。
Cull Off/ Front / Back

  • 如果设置为 Back,那么那些背对着摄像机的渲染图元就不会被渲染,这也是默认情况下的剔除状态;
  • 如果设置为 Front,那么那些朝向摄像机的渲染图元就不会被渲染;
  • 如果设置为 Off,就会关闭剔除功能, 那么所有的渲染图元都会被渲染, 但由于这时需要渲染的图元数目会成倍增加, 因此除非是用于特殊效果,例如这里的双面渲染的透明效果,通常情况是不会关闭剔除功能的。