江枫

ShaderToy – Heart

ShaderToy地址

1.背景绘制

   这里的背景绘制比上一个要简单一些:

   首先计算了p,其中fragCoord本身就代表屏幕大小,以1920 * 1080举例,那么前半段(2.0 * fragCoord - iResolution.xy)就是把原来的范围扩大为二倍并进行一次位移:

  • x:[0, 1920] -> [-1920, 1920]
  • y:[0, 1080] -> [-1080, 1080]

   然后min(iResolution.y, iResolution.x)对屏幕上距离比较小的那一侧进行归一化:

  • x:[-1920, 1920] -> [-1.78, 1.78]
  • y:[-1080, 1080] -> [-1, 1]

   接下来计算颜色时使用了上面的结果p的Y值和距离值:

  • 其中y值越大,颜色的Blue色域越小。
  • P的距离越小,也就是P离原点越近,颜色就更亮(rgb都更高)。
  • 0.25只是为了控制这个颜色的范围,是一个理论值,此外我们还可以通过调节p的坐标来移动原点
    1 - length(p):

    1 - 0.25 * length(p):
2.绘制心形

   心形的绘制和我们之前绘制点和线的过程差不多:先确定心形的表达式,然后判断某个像素是否在心内,人如果在心内使用心的颜色,否则使用背景色。
   这里作者提供了两种心形的绘制方法,分别为:

和:

   说实话,两个都没看懂23333

3.填充心形颜色

   经过上面的一顿心形计算,其实我已经猪脑过载了,但是人生还是要继续,代码还是要抄下去,接下来搬一下心形的颜色

   上述两种计算方式最后都会声明一个r(p到中心点距离)和d(懵逼)。接下来的颜色计算可以看我从乐乐老师那偷过来的图:




   从图片我们可以直观的看出,第一行根据p的x方向来得到一个在x方向上的渐变,第二行在此基础上添加了根据p的距离来产生的渐变,虽然不明显但可以看出新的渐变有了弧形,第三行则是使用类似半兰伯特的方法,增亮了左侧暗部区域,而最后一行则关键的分出了心形内外的区域颜色。

4.心的跳动

   跳动相关函数也基本上直接拿过来就可以用了:

   简简单单的四行代码,我只能看懂第一行是一个周期函数,而且周期是1.5s。(先对1.5求余,把时间限定到范围[0-1.5],然后再除1.5进行归一化,时间变成[0-1]范围)
   然后接下来2、3行就是对这个周期函数一顿操作,很不幸我又猪脑过载了。但是乐乐老师总结了这是一段周期函数的动画效果,大概曲线为:

   通过上面的曲线我们可以看出来,这个函数的y值范围基本都在1附近跳动。所以第4行其实就是将这个曲线和我们想要的心在y轴上拉伸,x轴上收缩进行一次加权平均。x没什么好说的,两个各取0.5,但y值因为在1附近跳动,当取值为0.5时值也在0.5左右跳动,这里取-0.5时,为了保证结果不会十分夸张,所以前面的值选择在1.5,所以最终结果会在1-5-0.5=1左右跳动。

5.结果

GIF

   这一顿抄下来,猪脑疯狂过载,数学太差了啊。完整代码:

文章大纲