混合模式参考
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) 对每条曲线通道独立处理:
- 空通道跳过——
Keys.Num() == 0的通道不参与组合,保留InOutState已有值。这保证层间无交叉污染:Layer[0] 有 ScaleX 无 Opacity、Layer[1] 有 Opacity 无 ScaleX → 最终 ScaleX 来自 Layer[0],Opacity 来自 Layer[1] - 非空通道先临时构建
FRichCurve,Eval(LocalTime)后按本层 BlendMode 组合 - 组合从
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
视觉对比表
| 场景 | Additive | Override | Multiply | CrossFade |
|---|---|---|---|---|
| 位移叠加 | 抖动 + 摇摆 → 复合偏移 | 只保留摇摆位移 | 抖动 × 摇摆 → 缩小的偏移 | 固定 0.5 插值 |
| 颜色混合 | 染色叠加 → 更亮/更浓 | 只保留上层染色 | 不适用于染色(恒等 0 陷阱) | 固定 0.5 插值 |
| 缩放调制 | 放大 + 缩小 → 抵消 | 只保留缩小 | 放大 × 0.5 → 半放大 | 固定 0.5 插值 |
与阶段过渡的交互
阶段过渡由 UTextAnimationBlueprint::StageTransitionConfig(FStageTransitionConfig)配置:
| 字段 | 默认值 | 说明 |
|---|---|---|
IntroToDefaultCrossFade | 0.1 | 入场 → 默认过渡时长(秒) |
DefaultToOutroCrossFade | 0.1 | 默认 → 出场过渡时长(秒) |
EasingFunc | EEasingFunc::Linear | 过渡缓动函数 |
层级关系:
字形渲染状态
└─ FBakedGlyph::Evaluate —— 逐层混合(ETextAnimationBlendMode,层内)
└─ UTextAnimationStageController —— 阶段切换(FStageTransitionConfig,跨阶段)