您当前的位置: 首页 >  Jave.Lin

CG cosh, exp, sinh, smoothstep, tanh, perlin_easeCurve1/2 曲线

Jave.Lin 发布时间:2019-08-23 12:24:19 ,浏览量:4

文章目录
  • 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中的关键字、语义词、函数库
关注
打赏
1688896170
查看更多评论

Jave.Lin

暂无认证

  • 4浏览

    0关注

    546博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0812s