1. ホーム

[解決済み】GLSL用ランダム/ノイズ関数

2022-04-19 03:18:42

質問

GPUドライバのベンダーは、通常、わざわざ noiseX をGLSLで探しています。 グラフィックランダム化 swiss army knife" ユーティリティ関数セットで、できればGPUシェーダー内で使用するために最適化されていることが望ましいです。私はGLSLを好みますが、どんな言語でもコード化できますし、自分でGLSLに翻訳することもできます。

具体的には、以下のようなことを期待します。

a) 擬似乱数関数 - M次元の種(理想的には任意の値ですが、一様な結果分布のためには、種を例えば0〜1に制限してもらっても構いません)から計算された、[-1,1]または[0,1]の上のN次元、一様分布。というようなものです。

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 Noiseのような - 再び、N次元、+- 一様分布、値の制約されたセットと、まあ、見栄え(Perlinレベルのように外観を設定するいくつかのオプションも便利かもしれません)。というようなシグネチャを期待しています。

float noise  (T coord, TT seed);
vec2  noise2 (T coord, TT seed);
// ...

私は乱数発生理論にあまり詳しくないので、一番熱心になるのは 既製のソリューション のような回答もお待ちしています。 1次元のrand()は非常に効率的で良いのですが、その上にN次元のrand()を作る方法を説明します。 .

どのように解決するの?

ごく簡単な擬似乱数っぽいものなら、ネットのどこかで見つけたこのワンライナーを使っています。

float rand(vec2 co){
    return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
}

また、好きなPRNGを使ってノイズテクスチャを生成し、これを通常の方法でアップロードして、シェーダで値をサンプリングすることも可能です。

また、以下をチェックしてください。 このファイル は、Stefan Gustavson による Perlin と Simplex noise の GLSL 実装です。