frac函数返回标量或每个矢量中各分量的小数部分。
上图演示的是通过frac函数形成的图像效果,它只是frac函数的简单实现。我们经常会使用frac函数做噪声效果的处理,如果还未看过噪声部分的实验,可以学完本篇实验,去学习噪声实验的部分。
原理
frac函数通过如下代码实现:
float frac(float v)
{
// floor函数返回值会向下取值
// floor实验部分可查看《Shader实验室:floor函数》
return v - floor(v);
}
该函数只有一个参数v,v参数的类型不仅可以是float类型,也可以是其它float向量。通过该函数的实现可知,它返回标量或每个矢量中各分量的小数部分。它在坐标轴上的效果如下:
上图是frac(x)所呈现的坐标轴效果图,我们可以尝试下,当把x乘上2所呈现的效果是怎样的:
由图中可知当把x乘上2后,所呈现的效果会更密,如果系数更大,结果也就越密,那么如果把x除以一个数呢?比如除以2(Shader中除法效率比乘法效率相对更低,所以我们乘于0.5)。
可以发现当x乘上一个小于1的值时,系数越小,呈现的图像结果会越稀疏。下面进入实验部分。
实验
-
新建Unlit Shader与Material。
-
打开Unlit Shader在frag函数部分写入如下代码:
fixed4 frag (v2f i) : SV_Target
{
// length部分实验参考《Shader实验室:length函数》
return frac(length(i.uv - 0.5));
}
效果如下:
- 到此还没有做到本篇实验开篇部分的效果,是因为frac返回结果的“密度”还没有达到要求,我们将length部分乘以10:
return frac(length(i.uv - 0.5) * 10);
- 最终效果如下:
感兴趣的小伙伴可关注下方的二维码。