TiXL 场景交叉淡化:Lib.flow.BlendScenes 运算符的浮点索引 Alpha 混合原理与实战
【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3
本指南以 TiXL(开源实时动态图形创作工具)的 BlendScenes 运算符为核心,讲解如何用单个浮点索引(BlendFraction)在一组绘制场景(Scenes)之间进行平滑的 Alpha 混合过渡。读完本文,你将掌握该运算符的输入输出契约、其基于 Switch / Modulo / HSLToColor 组合的内部实现原理,以及用动画驱动混合分数实现"场景 A → 场景 B"交叉淡化的完整实战方法。
运算符定位:从"硬切"到"软混合"
BlendScenes 隶属于 TiXL 的Lib.flow命名空间(运算符库中的"流程控制"分类,见 Lib.flow 目录),官方定义为:
Uses a float index to alpha blend between draw scenes.(使用一个浮点索引,在绘制场景之间进行 Alpha 混合。)
它与同命名空间下的 Switch 形成互补关系:Switch 接收整数索引,在多个连接场景之间做瞬时"硬切";而 BlendScenes 接收浮点索引,其整数部分负责选择相邻的两个场景,小数部分负责在两个场景之间插值混合,从而产生连续的淡入淡出效果。二者的输出均为T3.Core.DataTypes.Command类型的绘制命令,可直接串接进渲染管线。
输入与输出参数
BlendScenes 的参数契约(继承自 BlendScenes.md 并补充默认值与取值说明):
| 名称(相关性与类型) | 说明 |
|---|---|
| Scenes(Command Required) | 场景输入。多输入槽(MultiInputSlot),可同时连接任意数量的绘制场景命令;连接顺序即场景编号,从 0 开始。未连接足够的场景时,超出部分不会参与混合。 |
| BlendFraction(Single / 浮点) | 混合分数,驱动场景选择与透明度插值。默认值为 0.0;建议取值在[0, 场景数-1]区间内,超出范围的值会经过内部 Clamp 与 Modulo 处理(见下文实现剖析)。 |
输出:
| 名称 | 类型 |
|---|---|
| Output | T3.Core.DataTypes.Command |
源码级定义:槽位与 GUID
运算符的宿主代码位于 Operators/Lib/Symbols/flow/BlendScenes.cs,是一个继承自Instance<BlendScenes>的符号实例,通过声明式槽位定义接口:
namespace Lib.flow; [Guid("6e67d136-9285-48c6-a557-0a07361fc847")] internal sealed class BlendScenes : Instance<BlendScenes> { [Output(Guid = "bb6e9504-2e2c-413a-a455-5dd4ef41e3cb")] public readonly Slot<Command> Output = new(); [Input(Guid = "998b7cbc-b54c-4e81-bc61-31a7e05ce8e0")] public readonly MultiInputSlot<Command> Scenes = new(); [Input(Guid = "ce0e7890-b25c-45bd-8d7f-20865cc0a51a")] public readonly InputSlot<float> BlendFraction = new(); }从源码结构可以看出三个关键事实:
- Scenes 是多输入槽(
MultiInputSlot<Command>),这是它能同时容纳多个场景并支持编号索引的基础,与 Switch 的Commands多输入设计一致; - BlendFraction 是单精度浮点输入(
InputSlot<float>),InputSlot<float>支持时间曲线动画,这正是"用浮点索引驱动过渡"能力的关键前提; - 每个槽位都有独立 GUID,符号自身也有稳定 GUID(
6e67d136-...),这些标识被序列化进.t3文件用于保存连接图,也是文档自动生成机制定位该运算符的依据。
符号级定义与默认值记录在 Operators/Lib/Symbols/flow/BlendScenes.t3(FormatVersion: 3):Scenes默认值为null(空),BlendFraction默认值为0.0,与上述 C# 槽定义一一对应。UI 布局(输入/输出在画布上的坐标、子节点位置)则保存在 Operators/Lib/Symbols/flow/BlendScenes.t3ui。
内部实现剖析:一个由基础运算符搭成的混合流水线
BlendScenes 本身是一个复合符号——它没有自定义的Evaluate()逻辑,而是由一组基础运算符连接而成。从 BlendScenes.t3 的Children与Connections可以还原出完整的内部结构,共包含 12 个子节点:
| 子节点 | 角色推断 |
|---|---|
| Switch ×2 | 分别选中"当前场景"与"下一个场景" |
| Execute | 依次执行两组混合结果并恢复图形上下文 |
| Modulo | 对混合分数取模,实现索引环绕(越界回卷) |
| Clamp(Max 默认 10000) | 将分数限制在安全上限内,防止极端值破坏索引计算 |
| FloatToInt | 取浮点数的整数部分,得到场景索引 |
| AddInt(Input2 默认 1) | 对索引 +1,指向下一个场景 |
| Sub(Input1 默认 1.0) | 计算1 - 小数部分,生成互补的混合权重 |
| HSLToColor ×2(Lightness 默认 1.0) | 将混合权重映射为混合参数,两份互补值分别服务两个场景 |
| Group ×2 | 为各自选中的场景应用混合参数(透明度)后汇入 Execute |
综合这些连接关系,从结构上可以推断出如下算法流程:
- 归一与取整:
BlendFraction先经过Clamp(上限 10000),随后一路送入Modulo实现环绕、一路送入FloatToInt取整。整数部分floor(frac)就是"当前场景"的索引;该索引经AddInt(+1)后即"下一个场景"的索引。 - 双路选择:两个
Switch分别用上述两个索引从Scenes多输入中选出相邻的两个场景——这正是"浮点索引"能够完成跨场景连续过渡的核心:任何时刻最多只有相邻两帧场景参与计算。 - 权重互补:
Modulo输出的分数部分直接作为场景 B 的权重(经HSLToColor映射),同时经Sub(1 - frac)取反后作为场景 A 的权重,两路互补,保证混合权重总和始终为 1,从而亮度稳定、无跳变。 - 合成输出:两路(Switch → Group)结果一并接入同一个
Execute,由Execute顺序执行后汇入单一Output命令。
说明:上述步骤中涉及
HSLToColor与Group的具体参数传递细节,是从.t3文件的连接拓扑推断得出,并非由源码注释直接声明;但其"整数选场景、小数做混合、取模保环绕"的总体结构在连接表中清晰可见,可作为理解该运算符行为模型的可信依据。
这套组合式实现也体现了 TiXL 的运算符生态特点:任何复杂功能都可以由基础运算符(Switch、Execute、Modulo、数学运算、颜色运算)在节点图上组合出来,并以符号(Symbol)形式固化、复用。
与 Switch 的对比:硬切还是软混合
在 Lib.flow 中,场景切换有三类常用工具,适用场景各不相同:
| 运算符 | 输入类型 | 过渡方式 | 适用场景 |
|---|---|---|---|
| Switch | 整数Index | 硬切(瞬间切换),索引从 0 开始并自动环绕;-1可全部关闭、-2可全部激活 | 节目切换、AB 机位切换、需要精确到某一帧的跳转 |
| TimeClip | 时间轴上的剪辑条 | 在 Timeline 的 DopeView 中按时间播放自动激活,可拖拽排布、像 NLE 一样堆叠 | 时间线驱动的非线性剪辑式编排 |
| BlendScenes | 浮点BlendFraction | Alpha 软混合(相邻场景交叉淡化) | 平滑转场、情绪渐入渐出、连续漫游式预览 |
三者的输出均为T3.Core.DataTypes.Command,因此可以按需自由嵌套与混用。需要"切"用 Switch,需要"播"用 TimeClip,需要"溶"用 BlendScenes。
实战:用动画驱动 BlendFraction 实现平滑过渡
第一步:准备场景。将若干个场景命令(例如 Execute 分组或其它绘制命令)依次连接到Scenes多输入槽,连接顺序即索引顺序(0、1、2…)。
第二步:驱动混合分数。有两条推荐路径:
- 手动动画:为
BlendFraction输入接入一个浮点动画/曲线,例如把 0 → 1 的缓动曲线接到该槽,即可得到从场景 0 淡出、场景 1 淡入的过渡;继续 1 → 2 即可依次串联更多场景,形成整条演出序列。InputSlot<float>天然支持时间曲线,这是最直接的用法。 - 程序化驱动:把
BlendFraction接到时间、音频响度或 OSC/MIDI 数据映射出的浮点值上,让转场由实时数据触发——例如按节拍递增 1.0,配合内部 Modulo 的环绕特性,索引超出场景数后会自动回卷到场景 0,实现循环轮播。
第三步:观察与调试。混合权重互补的特性保证了过渡过程总亮度恒定。若出现跳变,优先检查BlendFraction取值是否远大于场景数(内部虽有 Clamp 与 Modulo 兜底,但动画曲线仍建议控制在[0, 场景数-1]区间内以保持可预测性)。
延伸阅读
- 运算符库总览:Lib.flow
- 硬切方案:Switch
- 分组与执行语义:Execute
- 时间线剪辑方案:TimeClip
- 源码与符号定义:BlendScenes.cs、BlendScenes.t3、BlendScenes.t3ui
【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考