smoothstep函数_SmoothStep是个啥?这是数学的魅力!

e0578bc32a484ccba3da2d21ffd934f9.png

大家好

鸽了这么长时间我终于更新了

最近太忙了都没时间打理公众号

3754de9bcbb96b5934482d758027a74d.png

BUT最近学到了一个技巧,看了很多相关的资料

很想和大家分享一下

所以这期是连夜赶出来的

接下来我们就一起了解下SmoothStep到底是啥

可能你们曾经用过这个功能

也有可能是第一次听说过

但今天你看完这篇

绝对可以从原理上弄得明明白白

0a4878055770a413919193255ec35c4c.gif

如果你现在问这个功能有什么用

我只能说这是一个

平滑输入值且变换区间的函数

是不是很抽象。。。

你此时心里肯定有千万头为什么的草泥马飞过

但是先不着急。。。

咱们会从最基础的函数开始

一步步将smoothstep推导出来

So let‘s get started!

接下来咱们会以UE4的SmoothStep为例讲解:

也就是下面这个东西

f93caa840e22e62da24b0fa240432228.png

首先使用这个节点的时候一定是一脸懵逼的:a是啥??b是啥??x又是啥???

当我们把这个材质功能点开时,可以看到他其实是对A、B、X三个数做了以下的运算:

e6b4ee45985554edfe70afa7ea7de9f7.png

如果代码看着有些晕,不要紧,这里其实是下面两个公式:

60d516b2259058d1bc3c9256d95a7287.png

其中,t的值被限制在了0-1的范围内

咱们可以看到这里有两个公式,首先看第一个,这是一个二元一次方程,利用咱们输入的A、B、X三个值求出一个数值t。单看这个函数非常抽象,如果咱们将其输入函数图像生成器,并定义A=0,B=1,X即为x时,将会得到以下的函数图像(这里叫函数的话,严谨一点应该写f(x)=的,不过大家理解就好)

8fc978c505c0fe02cb266a068c8323ff.png

这个函数既然加了定义区间,就会产生一些经验性的总结,即为以下结论:

当x < a < b 或 x > a > b时,返回值为0

x < b < a 或 x > b > a时,返回值为1

不过单看函数的话,相信你一定会说:这不就是t=x的函数图像嘛~但是咱们还有两个变量A和B,通过改变AB的数值,函数图像就会出现以下的变化:

15686d1c26c0aeb5da3b56cdc8f82954.gif

0d003cd67523c66b12d0e299c4733d11.gif

是不是很直观,改变A的值,则会改变函数图像与x轴的交点,而a的值刚好就是当t=0时x的取值,也即为函数图像和x轴相交的x取值。而整个变换的过程,相当于是将函数以(1,1)点为旋转中心旋转出来的结果。反观下一个参数,改变B的值则相当于是将函数图像以原点为中心旋转出来的结果,b的值刚好就是函数图像与t=1(这里的t即为y,因为前面的方程的f(x)定义为t,所以咱们就以t来代替)的交点的x值。

说着挺绕,但其实总结起来就一句话:这个函数的实际意义,就是将输入函数在x轴向上0-1范围内的取值变换到a-b的范围内,相当于是一个缩放函数。

讲到这里你可能会说:这么简单吗?我好了。。。BUT等等,重头戏在后面,咱们接着往下讲。

7d6dfdbf460a2ebbd7607c59f4244bee.gif

咱们通过上面的函数得到了一个结果值t,接下来咱们就需要对这个t做文章了,也就引出了下面这个公式:

2d35be4147dbb7adf22a5cb84b008ef7.png

公式对应的图像如下:

14522d5f2baf184ff39a7f96b05f0471.png

可以看到这个函数图像在x于0-1区间内呈现出微弱的“s”形,同时在(0,0)和(1,1)两个端点的函数图像切线斜率都为0,所以我们可以看出,这个函数就是前面第一个函数结果t的加权函数,相当于就是将t的值沿着曲线平滑了,如果表现在图像上的话,那就是提高图像的对比度,亮的越亮,暗的越暗(类似ps的曲线)。

但是如果我问你这个函数是怎么来的,相信你一定是黑入问号

b3c85e25152485a389608f66e392a4ac.gif

“这个二元三次方程,我都没学过咋个用嘛,他是凭空变出来的吗?????”

这当然不是凭空变出来的,咱们接下来就会讲讲怎么去推导出这个公式

巧妇难为无米之炊,当然推导出这个公式我们也需要一些“原材料”,这个原材料就是咱们高中学过的最熟悉的二次函数的标准式,我们将这个函数记录为函数C:

f(x)= x² 

b7b5d64d6aec33c74154f865e7923fb6.png

接下来我们将这个二次函数的标准式“魔改”一下:将函数沿x轴翻转一下,然后将其沿x轴和y轴的正方向挪动1个单位。即得到下面的公式和图形,我们将这个函数记录为函数D:

f(x)=1-(x-1)²

01e1399e800fb28ab672b4da33d7a92f.png

同时显示两个函数,我们就会得到下面这个效果:

49c9bf1469100a3a8ae6a6828d668bc5.png

可能你已经看出来了:如果我们将函数C,及左上的二次函数标准式,与函数D,及右下变化换后的二次函数,在x于0-1区间内做一下混合,这不就可以得出上面的公式了嘛。

不过要如何混合呢?这里咱们使用两个函数:一个是函数f(x)=x,我们将其记录为函数E。另外一个是函数f(x)=1-x,我们将其记录为函数F。函数图像如下所示:

e5bd3ecf205847f1f7da7473560ed10b.png

这不是正好可以作为混合两个函数的权重嘛!于是我们就可以将函数DE的积与函数CF的积相加,也就是DE+CF。我们带入公式即可得到以下表达式,我们将其记录为G

f(x)=x[1-(x-1)²]+x²(1-x)

说到这里你肯定会有点蒙,什么函数CDEF的记不清楚,所以咱们把这几个函数整理一下:

0233f761bfae8ee78c57025057a9a169.png

好的咱们继续,如果我们将上面的表达式f(x)=x[1-(x-1)²]+x²(1-x)精简一下,该合并的合并,就可以得到下面这个表达式:

f(x)=3x²-2x³

如果生成函数图像可以得到以下结果:

d10902c601da38c06dd608aeeb8601a5.png

哈哈是不是很巧??!我们将前面那个黑人问号的公式推导出来了,这里我们将x换成t,是不是就得到了下面的这个公式:

2d35be4147dbb7adf22a5cb84b008ef7.png

Ojierk,到这里,我们已经把两个公式的作用和函数都详细讲了一遍,是不是茅塞顿开,原来SmoothStep本身的作用就是:通过AB的值伸缩X的函数范围,同时对结果进行平滑处理。这里我们同时显示两个函数的函数图像,通过更改AB的值,大家可以很直观的感受到。

30178d6f9e497e98d461a1244510938d.gif

本文主要讲解了SmoothSteps的函数原理。具体的用法呢,大家下去可以思考思考。我相信了解原理之后,用起来也肯定会更加有底气。那么今天的科普就到这里啦,886~~

e0578bc32a484ccba3da2d21ffd934f9.png

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SmoothStep函数是一个用于生成平滑过渡的函数。它接受三个参数:t1,t2和x。首先,x的值会被标准化到0到1的范围内,公式为(x-t1)/(t2-t1)。然后,这个标准化后的值会通过一个三次多项式函数进行平滑处理,公式为x*x*(3-2*x)。最后,函数返回处理后的值。 SmoothStep函数的作用是在给定的范围内生成平滑的过渡效果。当x的值在t1和t2之间时,函数的返回值会在0到1之间变化。当x小于t1时,返回值为0;当x大于t2时,返回值为1。在t1和t2之间的过渡区域内,返回值会平滑地从0过渡到1。 SmoothStep函数可以用于各种应用,比如在图形渲染中实现平滑的颜色过渡效果,或者在动画中实现平滑的运动效果。 引用\[1\]中给出了SmoothStep函数的具体实现代码,而引用\[2\]中提到了一个类似于SmoothStep函数的公式,它也可以用于生成平滑过渡效果。这个公式是saturate((x-0.5)/max(0.001,a)+0.5),它将x的值在某一范围内进行缩放,并将结果限定在0到1之间。 总结来说,SmoothStep函数是一个用于生成平滑过渡效果的函数,它可以通过调整参数t1和t2来控制过渡的范围,而函数的返回值会在0到1之间平滑地变化。 #### 引用[.reference_title] - *1* [【Shader Graph】SmoothStep节点详解及其应用](https://blog.csdn.net/weixin_61427881/article/details/127839417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Unity Shader中常用函数及其几何意义--持续更新ing](https://blog.csdn.net/u010778229/article/details/107285163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值