目录

01UV坐标操控

05随机噪声

噪声的绝大部分效果都可以通过噪声贴图来实现。godot中也内置了很多噪声贴图生成方式,这些生成的贴图足以实现各种效果。这里生成这些贴图的方式,实际也是各种随机化算法。

不过理解如何shader中生成随机数字也是重要的。

其实这里的随机噪声关键就在于,给定一个输入,让输出看起来近似随机化,而不随着原始输入呈现出一定规律。例如将整个UV坐标作为输入,UV坐标有明显特征,从左上角到右下角从$(0,0)\to(1,1)$。但是随机化后,最理想是完全看不出来的噪点,大体显示为灰色。

简单给出随机化计算方式如下:

float random(vec2 uv)
{
    return fract(sin(dot(uv,vec2(12.9898,78.233)))*43758.5453123);
}

直接使用该随机值所谓灰度值会得到如下图形:

针对这张随机化图可以进一步做各种操作,例如

  • 像素化

根据之前的像素化,这里我们只要划分出像素块。并将对应的映射后坐标传入随机化方法之中即可。具体来说计算方式如下

uniform int grid_size = 8;

void fragment() {
    vec2 grid_layout = vec2(float(grid_size));
    // 标准像素化操作 这里的size 相当于形成 size*size像素块
    vec2 grid_site = floor(UV*grid_layout);
    // 可以不用在转回UV空间下,我们只需要知道每个色块映射的坐标值即可
    COLOR.rgb = vec3(random(UV));
}

最终效果如下:

  • 随机颜色块

前面看到可以生成随机像素块。现在有个新问题,如何生成对应的随机颜色块。

使用的随机函数给定一个二维坐标值,输出一个伪随机化数值。相当于$f_{random}(x,y)\to r$。灰度图直接使用随机结果即可。跟灰度图不一样的是,彩色不再是只有一个随机输出值,而是RGB,三个通道各不相同。

这里的做法就是给定每个通道不同的偏移量使得,看起来彩色随机即可。虽然偏移量看起会是整个图形的平移叠加,但如果整体都是随机的,那么叠加也是随机的。

最后只需如下即可:

void fragment() {
    // 每个通道添加一个偏移即可
    vec3 random_color = vec3(random(grid_site),random(grid_site+vec2(1.0,0.0)),random(grid_site+vec2(0.0,1.0)));
}
  • 直接使用噪音贴图

实际上Godot内部提供了直接生成噪音贴图的方式,可以通过声明一个sampler2D属性,然后赋值噪音贴图的方式来获取这样一张噪音贴图。如下:

现在再进行像素化就很简单了,直接对UV进行像素化,然后采样对应的噪音贴图即可得到最终结果。

噪音贴图的生成实际上就充当了上面二维随机变量的产生过程。而噪音贴图的生成算法有很多种,每种有不同特点,可以在逐步了解。