Shader实验室:frac函数

Number of views 366

frac函数返回标量或每个矢量中各分量的小数部分。

image.png

上图演示的是通过frac函数形成的图像效果,它只是frac函数的简单实现。我们经常会使用frac函数做噪声效果的处理,如果还未看过噪声部分的实验,可以学完本篇实验,去学习噪声实验的部分。

原理

frac函数通过如下代码实现:

float frac(float v)
{
  // floor函数返回值会向下取值
  // floor实验部分可查看《Shader实验室:floor函数》
  return v - floor(v);
}

该函数只有一个参数v,v参数的类型不仅可以是float类型,也可以是其它float向量。通过该函数的实现可知,它返回标量或每个矢量中各分量的小数部分。它在坐标轴上的效果如下:

image.png

上图是frac(x)所呈现的坐标轴效果图,我们可以尝试下,当把x乘上2所呈现的效果是怎样的:

image.png

由图中可知当把x乘上2后,所呈现的效果会更密,如果系数更大,结果也就越密,那么如果把x除以一个数呢?比如除以2(Shader中除法效率比乘法效率相对更低,所以我们乘于0.5)。

image.png

可以发现当x乘上一个小于1的值时,系数越小,呈现的图像结果会越稀疏。下面进入实验部分。

实验

  • 新建Unlit Shader与Material。

  • 打开Unlit Shader在frag函数部分写入如下代码:

fixed4 frag (v2f i) : SV_Target
{
  // length部分实验参考《Shader实验室:length函数》
  return frac(length(i.uv - 0.5));
}

效果如下:

image.png

  • 到此还没有做到本篇实验开篇部分的效果,是因为frac返回结果的“密度”还没有达到要求,我们将length部分乘以10:
return frac(length(i.uv - 0.5) * 10);
  • 最终效果如下:

image.png

感兴趣的小伙伴可关注下方的二维码。

image.png

0 Answers