- 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)
e
x
p
(
−
x
)
exp(-x)
exp(−x)
e
x
p
(
x
)
+
e
x
p
(
−
x
)
exp(x)+exp(-x)
exp(x)+exp(−x)
e
x
p
(
x
)
+
e
x
p
(
−
x
)
−
2
exp(x)+exp(-x)-2
exp(x)+exp(−x)−2
( 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
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
float sinh(float x)
{
return 0.5 * (exp(x)-exp(-x));
}
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));
}
float tanh(float x)
{
float exp2x = exp(2*x);
return (exp2x - 1) / (exp2x + 1);
}
tanh 的头部过渡速度比较快,中,尾部比较缓慢 一般比较多的动画也会用到类似的曲线
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)
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的头尾过渡比较缓慢,也就是说作数值过渡会比较饱满的头尾,中部过渡比较快一些
其实我们在很多平台的动画库(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中的关键字、语义词、函数库