文章目录
- cosh
- 为何叫双曲线
- exp(x)曲线
- exp(-x) 曲线
- exp(x)+exp(-x) 两曲线叠加
- 调整x=0时,y=0
- 调整x=-2 or 2时,y=1
- exp(-x*x)
- sinh
- smoothstep
- tanh
- perlin noise ease curve 1
- perlin noise ease curve 2
- Summary
- excel 文件
- References
xxxh
中的h==>hyperbolic:双曲线的意思
cosh
// see: https://developer.download.nvidia.cn/cg/cosh.html
float cosh(float x)
{
return 0.5 * (exp(x)+exp(-x));
}
0.5 ∗ ( e x p ( x ) + e x p ( − x ) ) 0.5 * (exp(x)+exp(-x)) 0.5∗(exp(x)+exp(−x))
为何叫双曲线
因为exp(x)就是一个曲线,而cosh中有exp(x)与exp(-x),所以就是两个(双)曲线咯
exp(x)曲线
e
x
p
(
x
)
exp(x)
exp(x)
exp(-x) 曲线
e
x
p
(
−
x
)
exp(-x)
exp(−x)
exp(x)+exp(-x) 两曲线叠加
e
x
p
(
x
)
+
e
x
p
(
−
x
)
exp(x)+exp(-x)
exp(x)+exp(−x)
调整x=0时,y=0
e
x
p
(
x
)
+
e
x
p
(
−
x
)
−
2
exp(x)+exp(-x)-2
exp(x)+exp(−x)−2
调整x=-2 or 2时,y=1
(
e
x
p
(
x
)
+
e
x
p
(
−
x
)
−
2
)
∗
(
1
/
e
x
p
(
x
)
+
e
x
p
(
−
x
)
−
2
)
(exp(x)+exp(-x)-2)*(1/exp(x)+exp(-x)-2)
(exp(x)+exp(−x)−2)∗(1/exp(x)+exp(−x)−2)
==>
∵
c
u
r
v
=
(
e
x
p
(
x
)
+
e
x
p
(
−
x
)
−
2
)
\because curv=(exp(x)+exp(-x)-2)
∵curv=(exp(x)+exp(−x)−2)
∵
i
n
v
C
u
r
v
=
1
/
c
u
r
v
\because invCurv=1/curv
∵invCurv=1/curv
∴
1
=
c
u
r
v
∗
i
n
v
C
u
r
v
\therefore 1=curv*invCurv
∴1=curv∗invCurv
exp(-x*x)
2022/07/14 再补充一条曲线
因为在制作 SSS 时,看到别人的代码中有一曲线
half3 Transmittance(half transmittanceMask, half3 sssColor, half3 lightDir, half3 normal, half3 viewDir)
{
half3 lll = normalize(lightDir + normal * 0.1f);
half VdotL = saturate(dot(viewDir, -lll));
half thickness = 1.0f - (VdotL * transmittanceMask);
//return exp((thickness) * half3( -8, -40, -64 ) ); // ref
return exp(-(thickness * thickness)) * sssColor * (1.0 - thickness);
}
其中留意:exp(-(thickness * thickness))
单独查看:exp(-x*x
sinh
float sinh(float x)
{
return 0.5 * (exp(x)-exp(-x));
}
smoothstep
smoothstep(min,max,x)
它的公式如下:
s
m
o
o
t
h
s
t
e
p
(
x
)
=
−
2
⋅
(
x
−
m
i
n
m
a
x
−
m
i
n
)
3
+
3
⋅
(
x
−
m
i
n
m
a
x
−
m
i
n
)
2
smoothstep(x)=-2 \cdot (\frac{x-min}{max-min})^3+3 \cdot (\frac{x-min}{max-min})^2
smoothstep(x)=−2⋅(max−minx−min)3+3⋅(max−minx−min)2
代码是在公式的基础上优化了写法的,可读性会差非常的多!
float smoothstep(float a, float b, float x)
{
float t = saturate((x - a)/(b - a));
return t*t*(3.0 - (2.0*t));
}
tanh
float tanh(float x)
{
float exp2x = exp(2*x);
return (exp2x - 1) / (exp2x + 1);
}
tanh 的头部过渡速度比较快,中,尾部比较缓慢
一般比较多的动画也会用到类似的曲线
perlin noise ease curve 1
3 ( t 2 ) − 2 ( t 3 ) 3(t^2)−2(t^3) 3(t2)−2(t3)可见perlin noise中初版的平滑插值,与smoothstep非常相似
3(t^2)−2(t^3)
perlin noise ease curve 2
6 ( t 5 ) − 15 ( t 4 ) + 10 ( t 3 ) 6(t^5)−15(t^4)+10(t^3) 6(t5)−15(t4)+10(t3)
6(t^5)−15(t^4)+10(t^3)
curve 2比curve 1的头尾过渡比较缓慢,也就是说作数值过渡会比较饱满的头尾,中部过渡比较快一些
Summary
其实我们在很多平台的动画库(tween)都会有类似的插值过渡算法
excel 文件
cosh_sinh_smoothstep_tanh_perlinEaseCurve1&2.xlsx 提取码: dxnr
References
- Cg / Standard Library / cosh
- Cg / Standard Library / sinh
- Cg / Standard Library / smoothstep
- Cg / Standard Library / tanh
- cg中的关键字、语义词、函数库