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进行像素化,然后采样对应的噪音贴图即可得到最终结果。
噪音贴图的生成实际上就充当了上面二维随机变量的产生过程。而噪音贴图的生成算法有很多种,每种有不同特点,可以在逐步了解。