平滑最小值

13 / 18
练习着色器中常用的数学基础积木。

普通的 min(a, b) 会在两个形状边界处产生硬折痕。smin(smooth minimum)用一条曲线平滑地连接两个距离场,让形状「融合」在一起:


min 和 smin 的区别

min(d1, d2) 取两者中较小的那个,两个圆的边界会在交汇处出现一个尖锐的折角——因为距离场在那里不连续。

smin(d1, d2, k) 在两个形状靠近时,把它们的距离场柔和地混合在一起,交汇处变成圆滑的连接,视觉上像橡皮泥被捏在一起。


第三个参数 k 控制融合范围

k = 0.2 时,融合发生在两个形状距离约 0.2 单位的范围内。k 越大,融合区域越宽越软;k 趋近于 0,效果接近普通 min


场景中有什么

画布里有两个圆形 SDF(有向距离场),圆心分别在 (-0.12, 0)(0.12, 0),半径都是 0.18。它们微微重叠。用 min 合并时,交汇处有硬折;改用 smin 后,两圆像水滴一样融合成一个整体。


试着改一改

改动效果
0.2 改为 0.05融合区域缩小,接近硬 min 的效果
0.2 改为 0.5融合区域很大,两圆像被强力捏在一起
两圆圆心间距从 0.24 改为 0.4两圆不再重叠,但 smin 仍会在近处产生细微融合
半径从 0.18 改为 0.12两圆变小,间距更明显

练习

float d = min(d1, d2); 改为使用 smin,让两个圆平滑地融合在一起。

答案解析

初始状态:min(d1, d2) 在两圆交汇处产生尖角——两个距离场直接相切,没有过渡。

改动后:smin(d1, d2, 0.2) 在两圆距离约 0.2 单位的范围内引入一条平滑混合曲线,距离场在交汇处变得连续,渲染出来的形状就像两个水滴合并。

试着把 k 改为 1.0,感受极宽融合区域下整个形状如何变成一个椭圆形的整体。

GLSL 代码编辑器

正确代码预览

当前代码预览