- 音视频
- 图形学
- 桌面应用
【免费下载链接】t3
TiXL is an open source software to create realtime motion graphics.
本篇技术指南围绕 TiXL(tooll3/t3 实时动态图形创作工具)算子库Lib.image.use中的Combine3Images节点展开,讲解它如何将三张输入图像(ImageA / ImageB / ImageC)的任意通道(R、G、B、Average、Brightness)重新组装进输出纹理的 RGBA 四个通道,并配合 Color 输入做通道预调制、配合 Alpha 模式与 Mip 生成控制输出结果。读完本文,你将掌握该节点的全部输入参数、下拉选项的真实取值语义、底层 HLSL 实现原理,以及它在 RGB 分离、三源合成类特效中的典型接法。
Combine3Images 是什么
Combine3Images位于算子库Lib.image.use分类下(参见 Lib.image.use 算子索引),官方定义为:
A node to combine 3 input images into the RGBA channels of a new one.
即:把三张输入图像合并到一张新图像的 RGBA 通道中。它是 TiXL 图像合成类算子的成员之一,官方文档将其与同目录下的 BlendImages、Blend、BlendWithMask 归为"所有混合/合成类操作"一族:
All blend ops and similar: [BlendImages] [Blend] [BlendWithMask] [Combine3Images]
与其余三个节点"按权重或蒙版把两张图混合成一张"的语义不同,Combine3Images 不做加权混合,而是逐通道重新路由:输出的每个通道都可以独立选择来自哪张图、哪个分量,因此特别适合构建通道级重组类特效(如 RGB 分离、三源通道交换、把三张灰度图打包成一张彩色图等)。
输入参数一览
官方文档给出了完整参数表,本节在保留原表的基础上,结合 Combine3Images.cs 的源码补齐每个下拉选项的真实取值与 Combine3Images.t3 中的默认值。
| 名称 | 相关性 & 类型 | 说明 | 默认值(来自 .t3) |
|---|---|---|---|
| ImageA | Texture2D,必填 | 第一路输入图像,参与 R/G/B/Average/Brightness 通道提取 | null |
| ColorA | Vector4 | 与 ImageA 采样的颜色逐分量相乘(调制系数),默认 (1,0,0,1) 即纯红 | (1, 0, 0, 1) |
| ImageB | Texture2D,必填 | 第二路输入图像 | null |
| ColorB | Vector4 | 与 ImageB 相乘的调制系数,默认 (0,1,0,1) 即纯绿 | (0, 1, 0, 1) |
| ImageC | Texture2D,必填 | 第三路输入图像 | null |
| ColorC | Vector4 | 与 ImageC 相乘的调制系数,默认 (0,0,1,1) 即纯蓝 | (0, 0, 1, 1) |
| SelectChannel_R | Int32(下拉) | 输出 R 通道的数据来源,见下方 SelectInput 枚举 | 0(ImageA_R) |
| SelectChannel_G | Int32(下拉) | 输出 G 通道的数据来源 | 6(ImageB_G) |
| SelectChannel_B | Int32(下拉) | 输出 B 通道的数据来源 | 12(ImageC_B) |
| SelectAlphaChannel | Int32(下拉) | 输出 Alpha 通道的数据来源,见下方 SelectAlphaInput 枚举 | 4(SetToOne) |
| GenerateMips | Boolean | 是否在输出纹理上生成 Mip 链 | false |
从 Combine3Images.cs 可以看到,三个 Select 通道输入都通过MappedType = typeof(SelectInput)映射为枚举下拉框,其完整取值语义为:
| 值 | 含义 | 值 | 含义 | 值 | 含义 |
|---|---|---|---|---|---|
| 0 | ImageA.R | 5 | ImageB.R | 10 | ImageC.R |
| 1 | ImageA.G | 6 | ImageB.G | 11 | ImageC.G |
| 2 | ImageA.B | 7 | ImageB.B | 12 | ImageC.B |
| 3 | ImageA.Average(RGB 均值) | 8 | ImageB.Average | 13 | ImageC.Average |
| 4 | ImageA.Brightness(感知亮度) | 9 | ImageB.Brightness | 14 | ImageC.Brightness |
Alpha 输入(SelectAlphaInput,Combine3Images.cs)的取值语义为:
| 值 | 含义 |
|---|---|
| 0 | 直接使用 ImageA 的 Alpha |
| 1 | 直接使用 ImageB 的 Alpha |
| 2 | 直接使用 ImageC 的 Alpha |
| 3 | 强制设为 0(完全透明) |
| 4 | 强制设为 1(完全不透明) |
注意到.t3默认配置(SelectChannel_R=0、SelectChannel_G=6、SelectChannel_B=12、SelectAlphaChannel=4)恰好构成"R 取 A、G 取 B、B 取 C、Alpha 全不透明"的默认路由,配合 A/B/C 三路默认的纯红/纯绿/纯蓝调制色,节点开箱即用即可观察典型的三通道合成效果。
输出
| 名称 | 类型 |
|---|---|
| Output | T3.Core.DataTypes.Texture2D |
输出是一张新的 Texture2D,其尺寸由内部_trippleImageFxSetup算子与渲染目标的设置决定,RGB 三通道来自 Select 路由,Alpha 通道来自 Alpha 模式选择。
内部实现:从算子到 HLSL
Combine3Images 并不是直接写像素的叶子节点,从 Combine3Images.t3 的 Connections 可以看出,它是一个组合算子:内部实例化了一个名为_trippleImageFxSetup的子算子,并把 ShaderPath 指向Lib:shaders/img/use/img-combine-3.hlsl,同时用多个Vector4Components(拆解 ColorA/B/C)、IntToFloat(把通道选择索引转为 float)子算子把上层输入喂给该子算子的FloatParams多输入槽。
底层渲染核心位于 img-combine-3.hlsl(作者 Thomas Helzle,Screendream.de,2022),其像素着色器逻辑可分三步理解:
- 采样与调制(第 42-44 行):三路纹理按同一组 UV 采样,并分别乘以 ColorA/B/C:
float4 tA = ImageA.Sample(texSampler, psInput.texCoord) * ImageAColor; float4 tB = ImageB.Sample(texSampler, psInput.texCoord) * ImageBColor; float4 tC = ImageC.Sample(texSampler, psInput.texCoord) * ImageCColor;这意味着 Color 参数不仅是"着色",更相当于通道级增益系数:例如把 ColorA 设为 (1,0,0,1),则 tA 中只有 R 分量被保留,G/B 被清零——这正是在合成前对某一路做"只留红色"预处理的低成本做法。
Alpha 模式分发(第 48-69 行):按
AlphaMode的 0-4 五个 case 分别取 tA.a / tB.a / tC.a / 0.0 / 1.0,与前端枚举一一对应。逐通道路由(第 71-109 行):把 Select_R/G/B 组成
int3,循环三次、用switch按 0-14 的 15 个 case 取出对应分量,写入color[0..2],最终返回float4(color.rgb, a)。
关于两个非直接分量的实现细节:
- Average:
(r+g+b)/3.0,即算术平均灰度; - Brightness:
min(1.0, max(0.0, 0.239*r + 0.686*g + 0.075*b)),即 Rec.709 风格感知亮度权重并钳制到 [0,1](第 86 行)。当某一路需要"按灰度参与合成"(例如当作蒙版或亮度图打包)时,选 Average 或 Brightness 比单独选某个通道更合理。
实战接法:RGB 分离示例
仓库自带的示例 RgbSplitShiftExample.t3 展示了 Combine3Images 的典型上游组合:Pixelate像素化后的图像、TransformImage旋转后的图像、RenderTarget渲染结果等三路信号分别接入 ImageA/ImageB/ImageC(第 866-882 行),再配合后续的 Layer2d、DrawMesh 等算子输出到画布。
据此可以总结出几个直接可复用的接入套路:
通道打包(Channel Packing):把三张灰度图分别作为 ImageA/B/C,三个 Select 分别设为 ImageA.R / ImageB.R / ImageC.R(值 0/5/10),Alpha 选 SetToOne,即得一张三通道彩色图。这一模式与同分类下 CombineMaterialChannels、CombineMaterialChannels2(把 roughness/metallic/AO 打包给 [SetMaterial])思路一致,但 Combine3Images 的通道来源选择更自由,不局限于 PBR 语义。
RGB 分离效果:将原始图的三路经过不同位移(如分别做 R/G/B 偏移的 Glitch 类效果)后接入三路输入,Select 保持默认的 R←A、G←B、B←C,即可得到经典色散效果——示例 RgbSplitShiftExample 正是这种思路的完整演示。
亮度/蒙版重映射:把同一张图接三路,分别选 ImageA.Average、ImageA.Brightness 与固定常数色,可快速得到灰度与亮度信息重组的变体。
混合任意来源:由于每个输出通道可独立选择三路中的任一通道或灰度派生值,Combine3Images 天然可用于"三选一/三选多"的通道路由,配合
SelectChannel_*三个输入均可接表达式或动画值,可以实时驱动通道在 A/B/C 之间切换。
使用提示与注意事项
- 必填输入:ImageA / ImageB / ImageC 均为
Texture2D Required,未连接时输出无法正确更新;Color 输入虽然非必填,但默认值决定了各路的调制色,改动前请确认其 RGB 分量是否符合预期。 - 尺寸一致性:三路输入按同一组 UV 采样,若三张图分辨率不一致,输出会按渲染目标尺寸统一处理,建议在接入前用 TransformImage 或 RenderTarget 统一规格。
- Alpha 的取舍:默认 Alpha 为 SetToOne(不透明)。当需要把 A/B/C 某一路的透明度传递出去时,将
SelectAlphaChannel改为对应选项(0/1/2);需要完全透明或实心则用 3/4。 - Mip 链:若输出纹理后续会被缩小采样(例如作为远处贴图或被 Scale 缩小),可打开
GenerateMips避免闪烁与摩尔纹;若只是逐像素取用,保持 false 更省资源。 - 性能:整个节点是一次全屏像素着色器 pass,与图像分辨率正相关,适合在实时渲染与演出场景下作为后处理链的一环使用。
延伸阅读
- 算子库分类索引:Lib.image.use 全部图像使用类算子
- 同族混合节点:BlendImages / Blend / BlendWithMask
- 通道打包的 PBR 应用:CombineMaterialChannels
- 源码与资源:Combine3Images.cs、Combine3Images.t3、着色器 img-combine-3.hlsl、内部载体算子 _trippleImageFxSetup.cs
- 音视频
- 图形学
- 桌面应用
【免费下载链接】t3
TiXL is an open source software to create realtime motion graphics.
相关推荐
TiXL 中的 CombineMaterialChannels2 操作符:三图通道重组与 PBR 材质贴图打包实战
TiXL 中的 CombineMaterialChannels2 操作符:三图通道重组与 PBR 材质贴图打包实战 CombineMaterialChannel
音视频图形学桌面应用TiXL 图像混合指南:BlendWithMask 节点详解——用遮罩亮度在两幅图像间无缝过渡
TiXL 图像混合指南:BlendWithMask 节点详解——用遮罩亮度在两幅图像间无缝过渡 导读 BlendWithMask 是 TiXL 实时图形创作工具
音视频图形学桌面应用ImpromptuInterface核心组件解析:ActLike方法背后的动态代理生成机制
ImpromptuInterface核心组件解析:ActLike方法背后的动态代理生成机制 ImpromptuInterface是一个强大的.NET库,它通过结
音视频图形学桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考