一个IQ的函数
在IQ的这篇博客 iquilezles.org/articles/di… 中,提到了SmoothUnion的函数
float opSmoothUnion( float a float b, float k )
{
float h = clamp( 0.5 + 0.5*(b-a)/k, 0.0, 1.0 );
float m = k*h*(1.0-h);
return mix( b, a, h ) - m;
}
这个函数非常不好理解,为什么就通过这个函数,就能达到丝滑的合并效果. 蓝色为使用普通 min函数的效果,黄色为smoothmin的效果
通过图像理解
有以下两个函数图像, 和
用的图像会产生两个尖角,这两个点是不连续的
IQ的设计函数 smooth_min(a, b, k), 输入两个函数a,b,通过k值可以控制两个函数smooth min到下图
函数理解
h用于lerp
首先h用于lerp 两个函数, h必须是在[0,1] 之间,这也是为什么h需要套上一个clamp夹子函数。 在the art of code 的视频中有提到为什么需要在h里面增加一个0.5, 其实我们只要展开h 就能明白,因为smoothUnion是相互的,a,b应该是顺序无关的。 假设k=1
在上面的公式中,如果h不加上0.5, a,b在上面等式中就不对成了
m较正位置
m的作用是将图像的位置校准位置,如下图所示
如果把函数都展开可以得到, 可以看到其实他用的就是这个新函数的图像