WebGL随机数的生成
2024-01-31 20:21:46
大自然中有很多现象几乎是无序的,要模拟这些无序的自然现象,就要用到随机。着色器没有现成的随机函数,只能通过人工来构建随机函数。
人工随机
人工随机是指通过一些数学算法来构造随机数,这些算法通常基于一些看似随机的现象,比如当前时间、鼠标位置、键盘输入等。
基于时间的随机数
最简单的随机数生成方法是基于时间的随机数,可以使用JavaScript的Date.now()函数来获取当前时间戳,然后对时间戳进行一些处理,比如取余数或者做一些位运算,就可以得到一个随机数。
function rand(seed) {
return (seed * 9301 + 49297) % 233280;
}
这种方法生成的随机数虽然不是真正的随机数,但对于大多数应用来说已经足够了。
基于鼠标位置的随机数
另一种随机数生成方法是基于鼠标位置的随机数,可以使用JavaScript的MouseEvent.clientX和MouseEvent.clientY属性来获取鼠标当前位置,然后对鼠标位置进行一些处理,比如取余数或者做一些位运算,就可以得到一个随机数。
function rand(seed) {
return (seed * 751 + 13526) % 65536;
}
这种方法生成的随机数比基于时间的随机数更随机一些,但仍然不是真正的随机数。
基于键盘输入的随机数
还有一种随机数生成方法是基于键盘输入的随机数,可以使用JavaScript的KeyboardEvent.keyCode属性来获取键盘当前按下的键码,然后对键码进行一些处理,比如取余数或者做一些位运算,就可以得到一个随机数。
function rand(seed) {
return (seed * 11907 + 25555) % 32768;
}
这种方法生成的随机数比基于时间的随机数和基于鼠标位置的随机数更随机一些,但仍然不是真正的随机数。
伪随机
伪随机是指通过计算机算法来生成随机数,这些算法通常基于一些数学公式,这些公式经过精心设计,可以产生看起来随机的序列。
线性同余法
线性同余法是最常用的伪随机数生成算法之一,其公式如下:
X[n] = (a * X[n-1] + c) mod m
其中,X[n]是第n个随机数,X[n-1]是第n-1个随机数,a、c和m是常数。
梅森旋转法
梅森旋转法是另一种常用的伪随机数生成算法,其公式如下:
X[n] = (X[n-1] ^ (X[n-1] >> u)) & (X[n-1] >> s) ^ (X[n-1] >> t)
其中,X[n]是第n个随机数,X[n-1]是第n-1个随机数,u、s和t是常数。
伪随机数虽然不是真正的随机数,但对于大多数应用来说已经足够了。
总结
随机数在计算机图形学中有很多应用,比如模拟自然现象、生成随机纹理、生成随机颜色等。在WebGL中,可以通过人工随机函数或伪随机函数来生成随机数。