Unity3D:ShaderLab 命令-Blend
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
ShaderLab 命令:Blend
确定 GPU 如何将片元着色器的输出与渲染目标进行合并。
此命令的功能取决于混合操作,您可以使用 BlendOp 命令进行设置。请注意,虽然所有图形 API 和硬件都支持混合功能,但对某些混合操作的支持较为有限。
启用混合会禁用 GPU 上的一些优化(主要是删除隐藏的表面/Early-Z),这些优化会增加 GPU 帧时间。
渲染管线兼容性
功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP |
---|---|---|---|---|
Blend | 是 | 是 | 是 | 是 |
用法
此命令会更改渲染状态。在 Pass
代码块中使用它可为该通道设置渲染状态,或者在 SubShader
代码块中使用它可为该子着色器中的所有通道设置渲染状态。
如果启用了混合,则会发生以下情况:
- 如果使用 BlendOp 命令,则混合操作将设置为该值。否则,混合操作默认为
Add
。 - 如果混合操作是
Add
、Sub
、RevSub
、Min
或Max
,GPU 会将片元着色器的输出值乘以源系数。 - 如果混合操作是
Add
、Sub
、RevSub
、Min
或Max
,GPU 会将渲染目标中现有的值乘以目标系数。 - GPU 对结果值执行混合操作。
混合等式为:
finalValue = sourceFactor * sourceValue operation destinationFactor * destinationValue
在这个等式中:
finalValue
是 GPU 写入目标缓冲区的值。sourceFactor
在 Blend 命令中定义。sourceValue
是片元着色器输出的值。operation
是混合操作。destinationFactor
在 Blend 命令中定义。destinationValue
是目标缓冲区中现有的值。
签名 | 示例语法 | 功能 |
---|---|---|
Blend <state> | Blend Off | 禁用默认渲染目标的混合。这是默认值。 |
Blend <render target> <state> | Blend 1 Off | 如上,但针对给定的渲染目标。(1) |
Blend <source factor> <destination factor> | Blend One Zero | 启用默认渲染目标的混合。设置 RGBA 值的混合系数。 |
Blend <render target> <source factor> <destination factor> | Blend 1 One Zero | 如上,但针对给定的渲染目标。(1) |
Blend <source factor RGB> <destination factor RGB>, <source factor alpha> <destination factor alpha> | Blend One Zero, Zero One | 启用默认渲染目标的混合。为 RGB 和 Alpha 值设置单独的混合系数。(2) |
Blend <render target> <source factor RGB> <destination factor RGB>, <source factor alpha> <destination factor alpha> | Blend 1 One Zero, Zero One | 如上,但针对给定的渲染目标。(1) (2) |
注意:
- 任何指定渲染目标的签名都需要 OpenGL 4.0+、
GL_ARB_draw_buffers_blend
或 OpenGL ES 3.2。 - 单独的 RGB 和 Alpha 混合与高级 OpenGL 混合操作不兼容。
有效参数值
参数 | 值 | 功能 |
---|---|---|
render target | 整数,范围 0 到 7 | 渲染目标索引。 |
state | Off | 禁用混合。 |
factor | One | 此输入的值是 one。该值用于使用源或目标的颜色的值。 |
Zero | 此输入的值是 zero。该值用于删除源或目标值。 | |
SrcColor | GPU 将此输入的值乘以源颜色值。 | |
SrcAlpha | GPU 将此输入的值乘以源 Alpha 值。 | |
DstColor | GPU 将此输入的值乘以帧缓冲区的源颜色值。 | |
DstAlpha | GPU 将此输入的值乘以帧缓冲区的源 Alpha 值。 | |
OneMinusSrcColor | GPU 将此输入的值乘以(1 - 源颜色)。 | |
OneMinusSrcAlpha | GPU 将此输入的值乘以(1 - 源 Alpha)。 | |
OneMinusDstColor | GPU 将此输入的值乘以(1 - 目标颜色)。 | |
OneMinusDstAlpha | GPU 将此输入的值乘以(1 - 目标 Alpha)。 |
常见混合类型 (Blend Type)
以下是最常见的混合类型的语法:
Blend SrcAlpha OneMinusSrcAlpha // 传统透明度
Blend One OneMinusSrcAlpha // 预乘透明度
Blend One One // 加法
Blend OneMinusDstColor One // 软加法
Blend DstColor Zero // 乘法
Blend DstColor SrcColor // 2x 乘法
示例
Shader "Examples/CommandExample"
{
SubShader
{
// 此处是定义子着色器的代码的其余部分。
Pass
{
// 为此通道启用常规 Alpha 混合
Blend SrcAlpha OneMinusSrcAlpha
// 此处是定义通道的代码的其余部分。
}
}
}
此示例代码演示在 SubShader 代码块中使用此命令的语法。
Shader "Examples/CommandExample"
{
SubShader
{
// 为此子着色器启用常规 Alpha 混合
Blend SrcAlpha OneMinusSrcAlpha
// 此处是定义子着色器的代码的其余部分。
Pass
{
// 此处是定义通道的代码的其余部分。
}
}
}
由3D建模学习工作室整理翻译,转载请注明出处!