GLSL的随机/噪声功能

由于GPU驱动程序供应商通常不愿意noiseX在GLSL中实现,因此我正在寻找“图形随机化瑞士军刀”实用程序功能集,最好对其进行优化以在GPU着色器中使用。我更喜欢GLSL,但是可以编写任何语言的代码,我可以自己将其翻译为GLSL。


具体来说,我期望:


a)伪随机函数 -N维,在[-1,1]或[0,1]上均匀分布,根据M维种子计算(理想情况下为任何值,但我可以限制种子设为0..1(用于统一结果分配)。就像是:


float random  (T seed);

vec2  random2 (T seed);

vec3  random3 (T seed);

vec4  random4 (T seed);

// T being either float, vec2, vec3, vec4 - ideally.

b)像Perlin 噪声这样的连续噪声 -同样是N维,分布均匀,具有一组受限制的值,而且看起来不错(一些配置外观(如Perlin级别)的选项也可能有用)。我希望像这样的签名:


float noise  (T coord, TT seed);

vec2  noise2 (T coord, TT seed);

// ...

我不太熟悉随机数生成理论,因此我非常希望获得预制的解决方案,但是我也很喜欢这样的回答:“这里有一个非常好的,高效的一维rand(),让我解释一下您如何在其上制作一个良好的N维rand()...”。


慕尼黑的夜晚无繁华
浏览 1378回答 3
3回答

30秒到达战场

对于看起来很简单的伪随机事物,我使用在互联网上某个地方找到的这个单件套:float rand(vec2 co){    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);}您还可以使用任何喜欢的PRNG生成噪声纹理,然后以常规方式上载此噪声并在着色器中采样值。如果您愿意,我可以在以后提取代码示例。
打开App,查看更多内容
随时随地看视频慕课网APP