混合模式参考

Texturge Beta 在每个字形动画层之间使用 ETextAnimationBlendMode 枚举定义混合模式。混合在 FPerLayerCurves::Evaluate 中以逐通道方式执行,每个 FBakedGlyph 持有按层组织的 TArray<FPerLayerCurves>(每层自带 BlendMode)。

模式一览

枚举值名称行为描述典型场景
Additive加法混合当前层值加到已累积结果上效果叠加(抖动 + 摇摆)
Override覆盖混合当前层值替换已累积结果互斥样式切换 / 基础层
Multiply乘法混合当前层值与已累积结果相乘强度调制(淡出 × 弹跳)
CrossFade交叉淡化与已累积结果按固定权值插值混合过渡

各模式详解

Additive(加法混合)

Result[channel] = Accumulated[channel] + CurrentLayer[channel]
  • 后续层在之前所有层之上累加
  • 适合组合多种效果,多层 Additive 是预设库(Bounce / Shake 等)的常用组合方式

NOTE

多层 Additive 累加可能导致数值超出合理范围,建议在动画曲线中自行控制幅值。

Override(覆盖混合)

Result[channel] = CurrentLayer[channel]
  • 完全替换已累积结果
  • 通常作为基础层CreateLayer 时指定),后续层仅在需要完全替换时使用

Multiply(乘法混合)

Result[channel] = Accumulated[channel] × CurrentLayer[channel]
  • 缩放或衰减上游层效果
  • 通道值为 1.0 时不影响上游结果,为 0.0 时完全消除

CrossFade(交叉淡化)

Result[channel] = Lerp(Accumulated[channel], CurrentLayer[channel], 0.5f)

逐通道求值语义

FPerLayerCurves::Evaluate(float LocalTime, FGlyphAnimationState& InOutState) 对每条曲线通道独立处理:

  1. 空通道跳过——Keys.Num() == 0 的通道不参与组合,保留 InOutState 已有值。这保证层间无交叉污染:Layer[0] 有 ScaleX 无 Opacity、Layer[1] 有 Opacity 无 ScaleX → 最终 ScaleX 来自 Layer[0],Opacity 来自 Layer[1]
  2. 非空通道先临时构建 FRichCurveEval(LocalTime) 后按本层 BlendMode 组合
  3. 组合从 FGlyphAnimationState::Identity() 开始逐层进行

逐层组合示例

OutState = Identity()
Layer[0] (Override)  → OutState.PositionOffset = (10, 0),  Scale = (1, 1)
Layer[1] (Additive)  → OutState.PositionOffset += (5, 5)   → (15, 5)
Layer[2] (Multiply)  → OutState.Scale *= (1.2, 1.0)        → (1.2, 1)
最终: PositionOffset=(15, 5), Scale=(1.2, 1)

NOTE

同一条 FPerLayerCurves 只有一个 BlendMode(作用于全部非空通道),不存在逐通道独立 BlendMode。需要不同混合语义时请拆分为多层。

染色通道的叠色规则

颜色通道(Color / ShadowColor)的混合与其他通道不同:

  • 染色恒等值为 Transparent (0,0,0,0),若按乘法规则 0 × 任意 = 0 会永久染黑
  • 因此染色通道采用加性叠色Base.Color += Layer.Color(与烘焙管线口径一致,0.4.0 修复)
  • 多层染色通过 A 通道(染色占比)控制强度:A=1.0 完全染色、A=0.5 与文本色 1:1

视觉对比表

场景AdditiveOverrideMultiplyCrossFade
位移叠加抖动 + 摇摆 → 复合偏移只保留摇摆位移抖动 × 摇摆 → 缩小的偏移固定 0.5 插值
颜色混合染色叠加 → 更亮/更浓只保留上层染色不适用于染色(恒等 0 陷阱)固定 0.5 插值
缩放调制放大 + 缩小 → 抵消只保留缩小放大 × 0.5 → 半放大固定 0.5 插值

与阶段过渡的交互

阶段过渡由 UTextAnimationBlueprint::StageTransitionConfigFStageTransitionConfig)配置:

字段默认值说明
IntroToDefaultCrossFade0.1入场 → 默认过渡时长(秒)
DefaultToOutroCrossFade0.1默认 → 出场过渡时长(秒)
EasingFuncEEasingFunc::Linear过渡缓动函数

层级关系

字形渲染状态
  └─ FBakedGlyph::Evaluate —— 逐层混合(ETextAnimationBlendMode,层内)
        └─ UTextAnimationStageController —— 阶段切换(FStageTransitionConfig,跨阶段)
images/blend-per-channel.png — 逐通道混合示意:同一个字形三层叠加,Layer0 Override 提供基础平移与缩放,Layer1 Additive 叠加抖动位移,Layer2 Multiply 调制缩放,各层仅对自身非空通道生效 — Per-layer blending diagram: a single glyph with three layers, Layer0 Override provides base translation and scale, Layer1 Additive stacks shake offsets, Layer2 Multiply modulates scale, each layer only affects its non-empty channels
images/stage-crossfade-layers.png — 混合层级示意:底部为层内逐通道混合(FBakedGlyph::Evaluate 按 BlendMode 组合),顶部为阶段切换(UTextAnimationStageController 依 FStageTransitionConfig 推进),两层级相互独立 — Layer hierarchy diagram: per-layer channel blending at the bottom (FBakedGlyph::Evaluate combining by BlendMode), stage transitions on top (UTextAnimationStageController advancing per FStageTransitionConfig), the two levels are independent