丝滑合并的函数理解

174 阅读1分钟

一个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的效果

2406163505

通过图像理解

有以下两个函数图像,a=xa=\sqrt{x}b=(2x)2b = (2-x)^2 2406152431

min(a,b)min(a, b)的图像会产生两个尖角,这两个点是不连续的

2406152333

IQ的设计函数 smooth_min(a, b, k), 输入两个函数a,b,通过k值可以控制两个函数smooth min到下图 2406155638

函数理解

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(ba)+.5mix(b,a,h)=ha+(1h)b=(ab)2+0.5a+0.5b\begin{aligned} h &= 0.5 * (b-a) + .5 \\ mix(b, a, h) &= h * a + (1-h) * b \\ &= -(a-b)^2 + 0.5a + 0.5b \end{aligned}

在上面的公式中,如果h不加上0.5, a,b在上面等式中就不对成了

m较正位置

m的作用是将图像的位置校准位置,如下图所示

2406165110

如果把函数都展开可以得到, 可以看到其实他用的就是这个新函数的图像

12k (ab)2 +0.5 a + .5b  .125-\frac{1}{2k}\ \left(a-b\right)^{2\ }+0.5\ a\ +\ .5b\ -\ .125

2406165838

资料