混合和合成2D节点

混合控制如何将一个图层或图像(源)的颜色和 alpha 值与底层图层或图像(目标)进行组合。Kanzi 默认情况下使用 Alpha:Premultiplied 混合模式混合 2D 节点,该模式使用源像素的 alpha 通道将源像素与目标像素进行混合。请参阅 颜色混合模式 和 高级颜色混合模式。

Alpha 合成控制如何使用源像素和目标像素的 alpha 通道来合并这些像素。Kanzi 支持 Porter-Duff 混合模式进行 Alpha 合成。请参阅 Alpha compositing modes(Alpha 合成模式)。

混合模式如何影响2D节点的渲染

在2D节点中,Material > Blend Mode 属性设置了 Kanzi 的方式:

  • 将节点及其子节点与底层图层混合。

    如果节点有子节点,并且您将 Blend Mode 属性设置为默认 Alpha: Premultiplied 以外的值,Kanzi 将合成这些节点,并使用您设置的混合模式渲染合成。

  • 渲染节点的前景和背景。

    如果在 2D 节点中同时设置 Foreground Brush 和 Background Brush 属性,混合模式会影响画笔的组合。

    如果节点同时具有背景和前景,并且混合模式不是 Alpha: Non-premultiplied 或 Opaque,Kanzi 将合成该节点,并使用您设置的混合模式渲染合成。

  • 渲染节点及分配给该节点的2D效果的组合。

    请参阅 2D 节点的效果。

../../_images/blend-mode-property.png

Kanzi 中的混合模式

混合模式控制 Kanzi 如何将一个图层或图像(源)的像素颜色和 alpha 值与底层图层或图像(目标)的像素颜色和 alpha 值进行组合。

颜色混合模式

本节介绍 Kanzi 中的颜色混合模式。

每个描述包括:

  • Kanzi 用于计算源 (\(src\)) 和目标 (\(dst\)) 组合的结果颜色 (\(C_{out}\)) 和 alpha (\(α_{out}\)) 的方程。

  • 可视化展示了混合模式如何在具有不透明(左)或部分透明(右)内容的重叠源图像和目标图像上操作:

不透明 (Opaque)

部分透明

目的地 (\(dst\))

../../_images/red-r255-g0-b64.png ../../_images/red-r255-g0-b64-0.7opacity.png

来源 (\(src\))

../../_images/blue-r32-g64-b255.png ../../_images/blue-r32-g64-b255-0.7opacity.png

Alpha:Premultiplied

期望源像素中的预乘 alpha RGBA,并使用源像素的 alpha 将源像素混合在目标像素之上。

此模式是默认和推荐的 alpha 混合模式,相当于 Porter-Duff 的 Source Over 模式。

\[\begin{split}&C_{out} = C_{src} + (1 - α_{src}) * C_{dst} \\ &α_{out} = α_{src} + (1 - α_{src}) * α_{dst}\end{split}\]
../../_images/blend-mode-alpha-premultiplied.png ../../_images/blend-mode-alpha-premultiplied-alpha.png

附加 (Additive)

将源像素添加到目标像素。

使用此模式用于您希望图层添加颜色但不减少底层图层颜色的效果。

\[\begin{split}&C_{out} = C_{src} + C_{dst} \\ &α_{out} = α_{src} + α_{dst}\end{split}\]
../../_images/blend-mode-additive.png ../../_images/blend-mode-additive-alpha.png

乘以

将源像素和目标像素相乘。

此模式与 Screen 模式相反。

例如,您可以使用此模式创建比其背景更暗的部分透明叠加层。请参阅 使用颜色混合创建一个叠加层。

\[\begin{split}&C_{out} = C_{dst} * C_{src} \\ &α_{out} = α_{dst} * α_{src}\end{split}\]
../../_images/blend-mode-multiply.png ../../_images/blend-mode-multiply-alpha.png

屏幕 (Screen)

将源像素和目标像素相加,并从结果中减去源和目标的乘积。

此模式与 Multiply 模式相反。

例如,您可以使用此模式创建比其背景更浅的部分透明叠加层。请参阅 使用颜色混合创建一个叠加层。

\[\begin{split}&C_{out} = C_{src} + (1 - C_{src}) * C_{dst} \\ &α_{out} = α_{src} + (1 - α_{src}) * α_{dst}\end{split}\]
../../_images/blend-mode-screen.png ../../_images/blend-mode-screen-alpha.png

Alpha:Automatic

将混合模式设置为以下之一:

  • 当项目或图像的 Premultiply Alpha 属性启用时,Alpha: Premultiplied。这是默认值。

  • 当项目或图像的 Premultiply Alpha 属性被禁用时,Alpha: Mixed。

请参阅 阿尔法预乘。

Alpha:Non-premultiplied

旧版模式。对于非预乘输入,请改用 Alpha: Mixed 模式。

Alpha: Non-premultiplied 模式期望源像素中的非预乘 alpha RGBA,并将源像素与目标像素混合。请注意,这会导致目标帧缓冲区中的 alpha 通道不正确。渲染到纹理并在稍后作为前景混合时,不能使用此模式。

Alpha:Mixed

期望源像素中具有非预乘 alpha 的 RGBA,并将源像素与目标像素进行混合。

例如,使用此模式当您动态加载不进行预处理的纹理时,该纹理使用的片段着色器不执行 RGB 颜色的 alpha 预乘。

\[\begin{split}&C_{out} = α_{src} * C_{src} + (1 - α_{src}) * C_{dst} \\ &α_{out} = α_{src} + (1 - α_{src}) * α_{dst}\end{split}\]
../../_images/blend-mode-alpha-mixed.png ../../_images/blend-mode-alpha-mixed-alpha.png

Alpha compositing modes(Alpha 合成模式)

This section describes the Porter-Duff blend modes in Kanzi. The Porter-Duff blend modes were defined by Thomas Porter and Tom Duff in their 1984 paper Compositing Digital Images.

使用 Porter-Duff 混合模式进行 alpha 合成。Porter-Duff 混合模式基于这些图层的 alpha 通道组合两个图层。如果目标帧缓冲区没有 alpha 通道,或者 alpha 值恒定为 1,许多 alpha 合成模式可能会产生不直观但正确的结果。例如,Source Out 模式产生的结果与 Clear 混合模式相同。

使用 alpha 合成时,确保将渲染目标的 alpha 通道设置为适合 alpha 合成。例如:

  • 使用通过启用 Node 2D > Force Composition 属性组合的父节点。这样,您可以将节点渲染到已清除的渲染目标。

  • 如果窗口表面是半透明的,使用 Clear 混合模式清除目标帧缓冲区。

默认情况下,Kanzi 使用 Alpha: Premultiplied 模式合成节点,该模式对应于 Porter-Duff Source Over 模式。

在 Kanzi 中,要实现 Porter-Duff Destination 或 Source 模式的行为,请在目标或源节点中禁用 Node > Visibility 属性。

每个描述包括:

  • Kanzi 用于计算源 (\(src\)) 和目标 (\(dst\)) 组合的结果颜色 (\(C_{out}\)) 和 alpha (\(α_{out}\)) 的方程。

  • 可视化展示了混合模式如何在具有不透明(左)或部分透明(右)内容的重叠源图像和目标图像上操作:

不透明 (Opaque)

部分透明

目的地 (\(dst\))

../../_images/red-r255-g0-b64.png ../../_images/red-r255-g0-b64-0.7opacity.png

来源 (\(src\))

../../_images/blue-r32-g64-b255.png ../../_images/blue-r32-g64-b255-0.7opacity.png

不透明 (Opaque)

用源像素替换目标像素。

此模式等同于Porter-Duff Source 模式。

\[\begin{split}&C_{out} = C_{src} \\ &α_{out} = α_{src}\end{split}\]
../../_images/blend-mode-opaque.png ../../_images/blend-mode-opaque-alpha.png

清除

将目标像素设置为透明黑色。

\[\begin{split}&C_{out} = 0 \\ &α_{out} = 0\end{split}\]
../../_images/blend-mode-clear.png ../../_images/blend-mode-clear.png

异或

绘制不重叠的源像素和目标像素。在重叠的源像素和目标像素中,通过目标 alpha 的反值减少源 alpha,通过源 alpha 的反值减少目标 alpha,然后合并像素。

\[\begin{split}&C_{out} = (1 - α_{dst}) * C_{src} + (1 - α_{src}) * C_{dst} \\ &α_{out} = (1 - α_{dst}) * α_{src} + (1 - α_{src}) * α_{dst}\end{split}\]
../../_images/blend-mode-exclusive-or.png ../../_images/blend-mode-exclusive-or-alpha.png

Source Atop

丢弃那些不覆盖目标像素的源像素,并将其余的源像素绘制在目标像素上。

\[\begin{split}&C_{out} = α_{dst} * C_{src} + (1 - α_{src}) * C_{dst} \\ &α_{out} = α_{dst}\end{split}\]
../../_images/blend-mode-source-atop.png ../../_images/blend-mode-source-atop-alpha.png

源于 In

绘制覆盖目标像素的那些源像素,并丢弃所有目标像素。

\[\begin{split}&C_{out} = α_{dst} * C_{src} \\ &α_{out} = α_{dst} * α_{src}\end{split}\]
../../_images/blend-mode-source-in.png ../../_images/blend-mode-source-in-alpha.png

源输出

绘制源像素,其 alpha 值由目标 alpha 的反值减少,并丢弃所有目标像素。

\[\begin{split}&C_{out} = (1 - α_{dst}) * C_{src} \\ &α_{out} = (1 - α_{dst}) * α_{src}\end{split}\]
../../_images/blend-mode-source-out.png ../../_images/blend-mode-source-out-alpha.png

Destination Atop

丢弃未被源像素覆盖的目标像素,并将其余目标像素绘制在源像素上。

\[\begin{split}&C_{out} = α_{src} * C_{dst} + (1 - α_{dst}) * C_{src} \\ &α_{out} = α_{src}\end{split}\]
../../_images/blend-mode-destination-atop.png ../../_images/blend-mode-destination-atop-alpha.png

目的地 在

仅绘制与源像素相交的目标像素,并丢弃所有源像素。

您可以使用此混合模式来实现遮罩效果。请参阅 使用 alpha compositing 创建遮罩效果。

\[\begin{split}&C_{out} = α_{src} * C_{dst} \\ &α_{out} = α_{src} * α_{dst}\end{split}\]
../../_images/blend-mode-destination-in.png ../../_images/blend-mode-destination-in-alpha.png

Destination Out

绘制目标像素时,alpha 值按源 alpha 的反值减少,并丢弃所有源像素。

您可以使用此混合模式来实现反向蒙版效果。

\[\begin{split}&C_{out} = (1 - α_{src}) * C_{dst} \\ &α_{out} = (1 - α_{src}) * α_{dst}\end{split}\]
../../_images/blend-mode-destination-out.png ../../_images/blend-mode-destination-out-alpha.png

目标结束

将目标像素绘制在源像素上。

\[\begin{split}&C_{out} = (1 - α_{dst}) * C_{src} + C_{dst} \\ &α_{out} = (1 - α_{dst}) * α_{src} + α_{dst}\end{split}\]
../../_images/blend-mode-destination-over.png ../../_images/blend-mode-destination-over-alpha.png

高级颜色混合模式

本节介绍 Kanzi 中的高级颜色混合模式。使用 OpenGL 或 OpenGL ES 时,这些模式需要 GL_KHR_blend_equation_advanced 和 GL_KHR_blend_equation_advanced_coherent 扩展。使用 Vulkan 时,这些模式需要 VK_EXT_blend_operation_advanced 扩展。

每个描述包括:

  • Kanzi 用于计算源 (\(src\)) 和目标 (\(dst\)) 组合的结果颜色 (\(C_{out}\)) 的方程。

    所有高级颜色混合模式都使用此方程来计算结果 alpha:

    \[α_{out} = α_{src} + (1 - α_{src}) * α_{dst}\]
  • 这些重叠的源图像和目标图像上混合模式操作的可视化:

目的地 (\(dst\))

../../_images/advanced-blend-modes-destination.png ../../_images/advanced-blend-modes-destination.png

来源 (\(src\))

../../_images/advanced-blend-modes-source-color.png ../../_images/advanced-blend-modes-source-bw.png

乘 (advanced khr)

将源和目标相乘,产生更深的颜色。除此之外,此模式与 乘以 模式类似,但它处理 alpha 的方式与 屏幕 (Screen) 模式相同。

\[C_{out} = C_{dst} * C_{src}\]
../../_images/blend-mode-multiply-advanced-color.png ../../_images/blend-mode-multiply-advanced-bw.png

Overlay

结合 乘以 和 屏幕 (Screen) 模式。当目标较亮时,源变得更亮;当目标较暗时,源变得更暗。此模式保留目标中的高光和阴影。

../../_images/blend-mode-overlay-color.png ../../_images/blend-mode-overlay-bw.png
\[\begin{split}&C_{out} = \begin{cases} 2 * C_{src} * C_{dst} & \text{如果 } C_{dst} <= 0.5\\ 1 - 2 * (1 - C_{src}) * (1 - C_{dst}) & \text{否则} \end{cases}\end{split}\]

变暗

比较目标和源的颜色并选择较暗的一个。

\[C_{out} = min(C_{dst}, C_{src})\]
../../_images/blend-mode-darken-color.png ../../_images/blend-mode-darken-bw.png

Lighten

比较目标和源的颜色并选择较亮的一个。

\[C_{out} = max(C_{dst}, C_{src})\]
../../_images/blend-mode-lighten-color.png ../../_images/blend-mode-lighten-bw.png

Color Burn

使目标变暗以反映源颜色,从而产生对比度更高、中间色调更饱和且高光减少的结果。白色源颜色不会产生变化。

此模式与 Color Dodge 模式相反。

../../_images/blend-mode-color-burn-color.png ../../_images/blend-mode-color-burn-bw.png
\[\begin{split}&C_{out} = \begin{cases} 1 & \text{如果 } C_{dst} >= 1\\ 1 - min(1, \frac{1 - C_{dst}}{C_{src}}) & \text{如果 } C_{dst} < 1 \text{ 且 } C_{src} > 0\\ 0 & \text{如果 } C_{dst} < 1 \text{ 且 } C_{src} <= 0 \end{cases}\end{split}\]

颜色减淡

使目标变亮以反映源颜色,产生对比度较低、饱和中间色调和高光溢出的结果。黑色源颜色不会产生变化。

此模式与 Color Burn 模式相反。

../../_images/blend-mode-color-dodge-color.png ../../_images/blend-mode-color-dodge-bw.png
\[\begin{split}&C_{out} = \begin{cases} 0 & \text{如果 } C_{dst} <= 0\\ min(1, \frac{C_{dst}}{1 - C_{src}}) & \text{如果 } C_{dst} > 0 \text{ 且 } C_{src} < 1\\ 1 & \text{如果 } C_{dst} < 0 \text{ 且 } C_{src} >= 1 \end{cases}\end{split}\]

强光

相乘或屏幕显示颜色:

  • 源颜色比 50% 灰色更浅时,会像屏幕一样使目标变亮。

  • 源颜色比 50% 灰色更暗时,会使目标变暗,就像将其相乘一样。

黑色源颜色生成黑色,白色源颜色生成白色。

../../_images/blend-mode-hard-light-color.png ../../_images/blend-mode-hard-light-bw.png
\[\begin{split}&C_{out} = \begin{cases} 2 * C_{src} * C_{dst} & \text{如果 } C_{src} <= 0.5\\ 1 - 2 * (1 - C_{src}) * (1 - C_{dst}) & \text{否则} \end{cases}\end{split}\]

柔光

使颜色变暗或变亮:

  • 源颜色比 50% 灰色更浅时,会使目标变亮,就像对其进行减淡一样。

  • 源颜色比 50% 灰色更暗时,会使目标变暗,就像在燃烧它一样。

结果比使用 Overlay 模式时更柔和。黑色或白色源颜色会产生明显更暗或更亮的结果,但不是纯黑或纯白。

../../_images/blend-mode-soft-light-color.png ../../_images/blend-mode-soft-light-bw.png
\[\begin{split}&C_{out} = \begin{cases} C_{dst} - ( 1 - 2 * C_{src}) * C_{dst} * (1 - C_{dst}) & \text{当 } C_{src} <= 0.5\\ C_{dst} + (2 * C_{src} - 1) * C_{dst} * ((16 * C_{dst} - 12) * C_{dst} + 3) & \text{当 } C_{src} > 0.5 \text{ 且 } C_{dst} <= 0.25\\ C_{dst} + (2 * C_{src} - 1) * (\sqrt{C_{dst}} - C_{dst}) & \text{当 } C_{src} > 0.5 \text{ 且 } C_{dst} > 0.25 \end{cases}\end{split}\]

差异

根据哪个颜色更亮,从目标颜色中减去源颜色或反过来。白色源颜色会反转目标颜色。黑色源颜色不会产生变化。

\[C_{out} = abs(C_{dst} - C_{src})\]
../../_images/blend-mode-difference-color.png ../../_images/blend-mode-difference-bw.png

排除

创建类似于 Difference 但对比度较低的效果。白色源颜色会反转目标颜色。黑色源颜色则不会产生变化。

\[C_{out} = C_{src} + C_{dst} - 2 * C_{src} * C_{dst}\]
../../_images/blend-mode-exclusion-color.png ../../_images/blend-mode-exclusion-bw.png

HSL 色相

用途:

  • 源的色调

  • 目标的亮度和饱和度

../../_images/blend-mode-hsl-hue-color.png ../../_images/blend-mode-hsl-hue-bw.png

HSL 饱和度

用途:

  • 源的饱和度

  • 目标的色调和亮度

../../_images/blend-mode-hsl-saturation-color.png ../../_images/blend-mode-hsl-saturation-bw.png

HSL 颜色

用途:

  • 源的色调和饱和度

  • 目标的亮度

../../_images/blend-mode-hsl-color-color.png ../../_images/blend-mode-hsl-color-bw.png

HSL 亮度

用途:

  • 源的亮度

  • 目标的色调和饱和度

../../_images/blend-mode-hsl-luminosity-color.png ../../_images/blend-mode-hsl-luminosity-bw.png

使用颜色混合创建一个叠加层

您可以使用颜色混合来创建比其背景更暗或更亮的部分透明叠加层。

../../_images/multiply-overlay-with-content.png ../../_images/screen-overlay-with-content.png

要创建一个可以应用后期处理效果的叠加层,请使用效果。例如,您可以使用多种效果来创建毛玻璃效果。请参阅 2D 节点的效果 和 使用多个效果。

要使用颜色混合创建叠加层:

  1. 在 Prefabs 中创建您用作叠加层根的预设。

    例如,创建一个 Empty Node 2D 预设,将其命名为 Notification,并将 Notification 预设添加到一个活动中。这样,当活动被激活时,您可以在 Preview 中看到预设的内容。

    ../../_images/notification-in-prefabs.png
  2. 在 Prefabs 中,选择您创建的预设或您添加了预设的活动,并在 Properties 中设置叠加层的大小和位置。

    ../../_images/notification-size.png
  3. 要绘制叠加层的背景,在您用作叠加层根的预设中创建一个 Empty Node 2D 节点,并在 Properties 中添加和设置:

    • 将 Foreground Brush 到您想要用来设置叠加颜色的颜色画笔。

    • Material > Blend Mode 到:

      • Multiply 创建一个比其背景更暗的覆盖层。

        乘以 混合模式将源(叠加)和目标(背景)像素相乘。

      • Screen 创建比其背景更浅的覆盖层。

        屏幕 (Screen) 混合模式将源(叠加)和目标(背景)像素相加,并从结果中减去源和目标的乘积。

    ../../_images/notification-overlay-in-prefabs.png ../../_images/set-blend-mode-multiply.png ../../_images/multiply-applied.png
  4. 在叠加预设的根部添加您想要显示在叠加顶部的内容。

    ../../_images/notification-content-in-prefabs.png ../../_images/multiply-overlay-with-content.png
  5. (可选) 要为叠加层创建淡出和淡入过渡效果,请使用状态管理器,其中在不显示叠加层的状态中:

    • 在叠加背景节点中设置 Foreground Brush 的 Brush Color:

      • 如果您的叠加背景使用 Multiply 混合模式,请将 Brush Color 设置为白色。

        当您将一种颜色与白色相乘时,该颜色不会改变。

        ../../_images/white-brush.png
      • 如果您的叠加背景使用 Screen 混合模式,请将 Brush Color 设置为透明黑色。

        当您将颜色与透明黑色混合时,该颜色不会改变。

        ../../_images/transparent-black-brush.png
    • 在包含您要在叠加层顶部显示的内容的节点中,将 Node > Opacity 属性设置为 0。

    您无法使用 Node > Opacity 属性调整叠加预设或叠加背景的不透明度,因为在节点中调整该属性会导致 Kanzi 合成该节点。出于同样的原因,您无法为叠加分配2D效果。例如,如果您的叠加背景使用 Multiply 混合模式,并且 Kanzi 合成叠加预设,Kanzi 将 Multiply 混合模式应用于空的合成渲染目标,导致叠加完全透明。

    ../../_images/blend-mode-multiply-overlay.gif

使用 alpha compositing 创建遮罩效果

您可以使用 alpha compositing 来实现一个简单的遮罩效果。

../../_images/mask-completed.png

要创建更通用的遮罩效果,请使用 Mask Effect 2D 效果。请参阅 使用 Mask Effect 2D 效果。

要使用 alpha compositing 创建遮罩效果:

  1. 创建一个 2D 节点,用于承载您想要遮罩的内容和遮罩。

    例如:在 Prefabs 中创建一个 Empty Node 2D 预设,并将其添加到一个活动中。这样,当活动被激活时,您可以在 Preview 中看到预设的内容。

    ../../_images/masked-content-in-prefabs.png
  2. 在您创建的节点中,创建:

    1. 您想要屏蔽的内容。

      ../../_images/content-to-mask-in-prefabs.png ../../_images/content-to-mask.png
    2. 您用作遮罩的节点。

      例如,创建一个 Image 节点,并在 Properties 中添加和设置:

      • 将 Image 到您想用作遮罩的纹理。

      • Horizontal Alignment 和 Vertical Alignment 到 Stretch

      ../../_images/mask-node-in-prefabs.png ../../_images/mask-properties.png ../../_images/mask-node-in-preview.png
  3. 选择您用作遮罩的节点,在 Properties 中添加 Material > Blend Mode 属性,并将其设置为 Destination In。

    目的地 在 模式使用遮罩的 alpha 通道绘制与遮罩相交的内容像素。

    小技巧

    要创建反向遮罩效果,请使用 Destination Out 模式。

    ../../_images/blend-more-destination-in.png ../../_images/mask-applied-without-composition.png
  4. 选择承载内容和遮罩的节点,在 Properties 中添加 Node 2D > Force Composition 属性,并启用它。

    这样即可设置 Kanzi 以合成节点并将其内容渲染到已清除的渲染目标。

    ../../_images/masked-content-in-prefabs2.png ../../_images/force-composition-enabled.png ../../_images/mask-completed.png

另请参阅

合成和混合

使用硬件合成

调整 2D 节点的外观

2D 节点的效果

使用状态机