本节摘要:Lerp 负责按比例混合两个值,Step 负责一刀切成两半,Smoothstep 负责带过渡地切。三个函数覆盖了从颜色渐变到溶解消失的绝大多数"数值整形"需求,本节每个函数配手算例题与实验,让你连线之前就能在纸上预判输出。
先建立一个视角:所谓着色效果,多数时候是在做"数值整形"——把一个平缓变化的输入(时间、UV、噪声)改造成我们想要的形状(一刀切开的边、柔和的过渡、往复的脉动)。这一节的三个函数就是三把最常用的整形刀。它们在图里都是现成节点,但只有能手算的人才能在复杂组合里预测行为。
Lerp(线性插值)有两个输入 A 与 B,一个比例 T,输出 A + (B - A) * T。T 为零时输出 A,为一时输出 B,中间按比例过渡。它可以从一维数扩展到颜色甚至向量——Shader Graph 里同一节点对四维颜色照样适用,就是每个分量各自插值。
手算例题一(标量):A = 2,B = 6,T = 0.25 Lerp = 2 + (6 - 2) * 0.25 = 3 手算例题二(颜色):A = 纯红 (1,0,0),B = 纯黄 (1,1,0),T = 0.5 Lerp = (1, 0.5, 0),橙红色
例题二顺手解释了一个日常现象:红黄之间为什么过渡自然——因为每个通道都在各自线性滑动。你在 1.2 节做的渐变、2.2 节脚本里的颜色脉动,用的都是它。
Step(阶跃)有两个输入 Edge(阈值)与 In(输入值),规则一句话:In >= Edge 时输出 1,否则输出 0。没有过渡,没有灰色地带。手算:
手算例题:Edge = 0.5 In = 0.2 输出 0;In = 0.5 输出 1;In = 0.9 输出 1 注意边界:恰好等于阈值时按输出 1 处理
听起来平淡,但 Step 是"阈值类效果"的心脏:溶解效果的"低于阈值就丢弃"(6.4 节)、菲涅尔边缘的"只保留亮圈"(5.2 节)、扫描线的"只显示扫过区域"(5.3 节),核心都是它。图上验证:把上一节菲涅尔链的 One Minus 输出接进 Step 的 In,Edge 接一个 Vector1 属性(默认 0.8),预览球的边缘光立刻收成一圈细线,拖动属性值看线圈变粗变细——Step 把连续的辉光"整形"成了硬边。
Smoothstep(平滑阶跃)输入比 Step 多一个:Edge1、Edge2、In。规则是 In 低于 Edge1 输出 0,高于 Edge2 输出 1,之间平滑过渡,过渡曲线是两头的导数为零的 S 形——这不是普通线性斜坡,边缘处会自然减速,看起来柔和得多。手算(用简化线性近似感受区间划分,精确值以曲线为准):
手算例题:Edge1 = 0.3,Edge2 = 0.7 In = 0.1 输出 0;In = 0.5 输出约 0.5;In = 0.9 输出 1

在渐变图上一次做完三个实验。实验一:Lerp 的 T 接 UV 的 G(回到最初版本),观察线性渐变。实验二:在 Lerp 输出与 Base Color 之间插一个 Smoothstep(Edge1 设 0.4、Edge2 设 0.6),渐变变成"下段一种颜色、上段另一种颜色、中间窄带过渡"。实验三:把 Smoothstep 换成 Step(Edge 设 0.5),过渡带彻底消失,硬切两半。三个实验共用一条数据链,只换整形函数,输出形态的差异一目了然——这就是"数值整形"最直观的样子。
💡 顺手记一个高频配角:Saturate 节点把任何数截断到零到一之间。点积会出现负值、噪声会溢出范围,接进颜色端口之前先 Saturate 一下,能省掉大量"颜色怎么发绿发紫"的怪现象。
用法一:颜色维度之外的一切混合——Lerp 混两个 UV 坐标就是坐标过渡,混两个位置向量就是位置过渡,节点对输入维度不做限制,同节点通吃。用法二:嵌套 Lerp 做多段渐变——两段 Lerp 串联(先混颜色 A 与 B,结果再与 C 混)可以做出三段色带,段的分界由各自 T 控制。案例章里大量"多区域混合"效果,底层都是嵌套 Lerp。
两个函数在阈值边界的行为有细微差别值得知道:Step 在输入恰好等于阈值时输出一(按"大于等于"处理);Smoothstep 在两个 Edge 相等时的行为未定义,务必保持 Edge1 小于 Edge2。另一个常用变形:把 Smoothstep 的两个 Edge 反着填(Edge1 大于 Edge2)可以实现反向过渡——虽然不推荐(可读性差),老项目里见到别慌,效果是从一到零的渐变。
把三个函数串成一条链算一遍,体验"心里跑图"。输入 In 取 0.6。第一步 Lerp:A 取 2、B 取 10、T 接 In,得 2 加 8 乘 0.6 等于 6.8。第二步 Saturate:把 6.8 截到 1。第三步 Step:Edge 取 0.5,输入 1 大于 0.5,输出 1。最终输出 1。同一道题把 In 换成 0.1:Lerp 得 2.8,Saturate 后是 1,Step 仍输出 1——两输入在 Step 处被抹平了差异。这提示一个设计教训:Step 的阈值要放在输入的实际变化区间内,否则整条链的输出永远是一个数,效果"焊死"。这类"输出不变"的症状,排查时先沿链手算一遍输入区间是否跨过了阈值。
| 函数 | 输入 | 输出特征 | 一句话用途 |
|---|---|---|---|
| Lerp | A B T | A 到 B 的连续过渡 | 混合一切 |
| Step | Edge In | 非零即一的硬切 | 阈值判断 |
| Smoothstep | Edge1 Edge2 In | S 形软切 | 带过渡的阈值 |
| Saturate | In | 截到零一 | 进颜色前兜底 |
三个节点族备齐,弹药库里已经有描边、全息、溶解的全部零件。下一章我们开始消耗弹药:从最直观的 UV 动画案例入手,让贴图真正流动起来。