目录
一、节点功能概述
颜色反相节点(Invert Colors Node)是 Unity Shader Graph 中用于实现颜色通道反相的专用工具。它通过对输入颜色的各个通道进行取反运算,将亮色转为暗色、暗色转为亮色,常用于实现负片效果、风格化渲染或特殊视觉反馈。该节点支持动态向量输入,可智能适配 Vector2/3/4 等不同维度的颜色数据,并允许单独控制红、绿、蓝和 Alpha 通道的反相状态。
二、端口与参数详解
2.1 端口配置
端口名称 | 方向 | 数据类型 | 描述 |
---|---|---|---|
In | 输入 | Dynamic Vector | 待反相的颜色值(范围 0-1) |
Out | 输出 | Dynamic Vector | 反相后的颜色值 |
2.2 控制参数
参数名称 | 类型 | 选项 | 描述 |
---|---|---|---|
Red | 开关 | True/False | 红通道反相开关(Vector2 及以上可用) |
Green | 开关 | True/False | 绿色通道反相开关(Vector3 及以上可用) |
Blue | 开关 | True/False | 蓝通道反相开关(Vector3 及以上可用) |
Alpha | 开关 | True/False | Alpha 通道反相开关(Vector4 可用) |
三、技术原理解析
3.1 反相运算核心公式
颜色反相的数学本质是通道值的线性变换,公式为:\(\text{Out} = 1 - \text{In}\) 对于范围在 0-1 的颜色值,反相操作相当于将每个通道值从原点对称映射到对侧(如 0.2→0.8,1→0)。
3.2 生成代码解析
hlsl
float2 _InvertColors_InvertColors = float4(Red, Green, Blue, Alpha);
void Unity_InvertColors_float4(float4 In, float4 InvertColors, out float4 Out)
{
Out = abs(InvertColors - In);
}
代码逻辑拆解:
- 反相掩码生成:
float4(Red, Green, Blue, Alpha)
将开关参数转换为浮点掩码(True→1,False→0)。 - 反相运算:
abs(InvertColors - In)
等价于:- 当通道反相开关为 True 时:
Out = 1 - In
- 当开关为 False 时:
Out = In
- 当通道反相开关为 True 时:
- 绝对值处理:由于掩码值仅为 0 或 1,
abs
函数在此处等效于直接计算差值,确保结果非负。
四、应用场景与实战案例
4.1 负片效果与风格化渲染
场景:复古胶片风格
- 实现步骤:
- 将纹理采样结果输入颜色反相节点,开启 RGB 通道反相
- 连接到颜色调整节点(如对比度、颗粒效果)
- 核心代码:
hlsl
float3 negativeColor = Unity_InvertColors_float3(textureColor.rgb, 1); finalColor = AdjustContrast(negativeColor, 1.2);
4.2 交互反馈与状态可视化
场景:按钮点击效果
- 需求:按钮按下时颜色反相,提供视觉反馈
- 实现方案:
- 在 UI 材质中添加颜色反相节点
- 通过脚本控制反相开关状态
csharp
// 按钮交互脚本 private Material buttonMaterial; public bool isPressed { get; set; } void Update() { // 根据按钮状态设置反相参数 buttonMaterial.SetFloat("_InvertRed", isPressed ? 1 : 0); buttonMaterial.SetFloat("_InvertGreen", isPressed ? 1 : 0); buttonMaterial.SetFloat("_InvertBlue", isPressed ? 1 : 0); }
4.3 特殊视觉效果
场景:故障艺术(Glitch Effect)
- 实现技巧:
- 将反相节点与噪声纹理结合,动态切换反相通道
- 添加随机延迟,模拟信号干扰效果
- 关键逻辑:
hlsl
// 生成随机反相掩码 float3 randomMask = step(noise(_Time.yx * 10), 0.3); float3 invertedColor = Unity_InvertColors_float3(inputColor, randomMask);
五、高级技巧与注意事项
5.1 性能优化策略
- 通道选择性反相:仅启用必要通道(如仅反相 RGB 而保留 Alpha),减少无效计算
- 合并操作:将反相节点与其他颜色操作(如亮度调整)合并为自定义节点,减少 Shader 指令数
5.2 输入范围注意事项
- 节点假设输入值在 0-1 范围内,若输入值超出此范围(如 HDR 颜色),反相结果将偏离预期
- 解决方案:在反相节点前添加
Clamp
节点,将值限制在 [0,1] 区间
5.3 多维度向量处理
- Vector2 场景:仅红、绿通道可用,蓝、Alpha 通道自动忽略
- Vector4 场景:支持全通道反相,常用于同时处理颜色和透明度
六、拓展应用与技术延伸
6.1 与其他节点的组合应用
- 反相 + 模糊:先反相再模糊,实现类似发光的边缘效果
- 反相 + 混合:通过混合节点将反相颜色与原图叠加,创造特殊光影效果
6.2 动态反相效果
- 呼吸灯效果:使用正弦函数动态调整反相强度
hlsl
float pulse = sin(_Time.y * 2) * 0.5 + 0.5; float3 dynamicInvert = Unity_InvertColors_float3(color, pulse);
- 节奏可视化:根据音频频谱动态切换反相通道
七、总结
颜色反相节点作为 Shader Graph 中的基础功能节点,通过简单的数学变换实现了丰富的视觉可能。从复古风格到交互反馈,其核心价值在于:
- 低成本高效果:无需复杂计算即可实现显著的视觉变化
- 灵活性强:支持单通道独立控制,适配多种创意需求
- 性能友好:底层实现高效,适合移动端等资源受限平台
掌握该节点的原理与应用,能够帮助开发者在材质设计和视觉效果实现中获得更灵活的控制能力,是 Shader Graph 进阶过程中的必备技能之一。