Unity3D:ShaderLab 命令-Blend

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

ShaderLab 命令:Blend

确定 GPU 如何将片元着色器的输出与渲染目标进行合并。

此命令的功能取决于混合操作,您可以使用 BlendOp 命令进行设置。请注意,虽然所有图形 API 和硬件都支持混合功能,但对某些混合操作的支持较为有限。

启用混合会禁用 GPU 上的一些优化(主要是删除隐藏的表面/Early-Z),这些优化会增加 GPU 帧时间。

渲染管线兼容性

功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP
Blend

用法

此命令会更改渲染状态。在 Pass 代码块中使用它可为该通道设置渲染状态,或者在 SubShader 代码块中使用它可为该子着色器中的所有通道设置渲染状态。

如果启用了混合,则会发生以下情况:

  • 如果使用 BlendOp 命令,则混合操作将设置为该值。否则,混合操作默认为 Add
  • 如果混合操作是 AddSubRevSubMinMax,GPU 会将片元着色器的输出值乘以源系数。
  • 如果混合操作是 AddSubRevSubMinMax,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)

注意:

  1. 任何指定渲染目标的签名都需要 OpenGL 4.0+、GL_ARB_draw_buffers_blend 或 OpenGL ES 3.2。
  2. 单独的 RGB 和 Alpha 混合与高级 OpenGL 混合操作不兼容。

有效参数值

参数功能
render target整数,范围 0 到 7渲染目标索引。
stateOff禁用混合。
factorOne此输入的值是 one。该值用于使用源或目标的颜色的值。
Zero此输入的值是 zero。该值用于删除源或目标值。
SrcColorGPU 将此输入的值乘以源颜色值。
SrcAlphaGPU 将此输入的值乘以源 Alpha 值。
DstColorGPU 将此输入的值乘以帧缓冲区的源颜色值。
DstAlphaGPU 将此输入的值乘以帧缓冲区的源 Alpha 值。
OneMinusSrcColorGPU 将此输入的值乘以(1 - 源颜色)。
OneMinusSrcAlphaGPU 将此输入的值乘以(1 - 源 Alpha)。
OneMinusDstColorGPU 将此输入的值乘以(1 - 目标颜色)。
OneMinusDstAlphaGPU 将此输入的值乘以(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建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:ShaderLab 命令-AlphaToMask (mvrlink.com)

下一篇:Unity3D:ShaderLab 命令-BlendOp (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号