20

Stefan Gustavson のシンプレックス ノイズに関する優れた論文を読みました。その中で次のことが約束されていました。

シンプレックス ノイズには顕著な指向性アーティファクトはありません

「古典的な」パーリンノイズとは対照的です。私は興奮してそれを実装し、反対のことが真実であるように見えることを知りました。クラシック ノイズにはアーティファクトが見られますが、主軸に対して 45 度に配置されたシンプレックス ノイズにも少なくとも同数のアーティファクトが見られます。ノイズをステップ関数にマッピングすると、特に顕著になります。

私の実装に問題がないことを確認するために、他の誰かの JavaScript 実装を使用しました。いくつかの画像を比較してください:

そして、ここにそれらすべてを含むギャラリーがあります。最後の画像で、水平/垂直から 45 度の位置にある境界線を探します。彼らはいたるところにいます。必要に応じてそれらのいくつかを強調することができますが、それらは私にとって本当に明白に思えます. (また、古典的なノイズ画像にもそれらが見られます。)

編集: より定量的にするために、100 万のランダム ポイントをサンプリングし、各ポイントについて、クラシック ノイズとシンプレックス ノイズの両方の勾配を数値的に計算し、xy 平面に投影された勾配の方向のヒストグラムを取得しました。方向性アーティファクトがなければ、グラフは平坦になります。しかし、クラシック ノイズとシンプレックス ノイズの両方が 45 度ごとにスパイクすることがわかります。

これはシンプレックス ノイズ アルゴリズムの問​​題ですか? それは修正できるものですか?それとも、これが問題だと思うのは私だけですか?

4

2 に答える 2

27

論文を読んだところですが、アーティファクトの原因が何かわかりました。グリッドの各頂点の勾配は、かなり小さなルックアップ テーブルから疑似ランダムに選択されます。Gustavson が 3 ページで述べているように:

「2D以上の場合、単位長さの異なる方向の勾配を選択することをお勧めします。2Dの場合、単位円の周りに分布する8または16の勾配が適しています。」

これは、古典的なパーリン ノイズで使用される方法であり、パーリンが2001 年の論文の 14 ページでシンプレックス ノイズに対して提案したものではありません。

「周囲の頂点ごとに疑似ランダム勾配のインデックスを計算するためにテーブル ルックアップ スキームを使用するのではなく、新しい方法では、非常に少数のハードウェア ゲートのみを使用するビット操作スキームを使用します。」

ただし、グスタフソンは 7 ページで次のように述べています。

「わかりやすくするためにハイブリッド アプローチを使用します。クラシック ノイズの勾配ハッシュ法を使用しますが、シンプレックス グリッドとシンプレックス ノイズのノイズ寄与の単純な合計を使用します。これは、実際にはソフトウェアでより高速な方法です。」

彼の 2D 実装は、実際には 3D グラデーション テーブルの 12 個のグラデーションを使用し、z 座標を破棄します。このスキームでは、エッジ座標はそれぞれ 2 回使用されますが、コーナーは 1 回しか使用されないため、90 度間隔で偏りが生じるように見えます。しかし、あなたが使用している実装には 8 つの勾配しかなく、45 度間隔でのバイアスがかなり示唆されているため、それはあなたの場合には関係ありません。このような最小の分散から現れる目に見えるパターンの可能性はかなり高いようです。しかし、mod 16 順列テーブルを使用して、そのアルゴリズムを 16 の勾配に適応させるのは簡単なはずです。これにより、方向アーティファクトを大幅に減らすことができます。

ただし、最終的には、グラディエント ノイズ関数の 1 オクターブに常にいくつかの目に見えるパターンがあると思います。これは、周波数の狭い範囲が摂動をグリッドに合わせる傾向があるため、設計によって帯域制限されているためです。三角グリッドであるため、シンプレックス ノイズは、勾配が完全にランダムであっても、60 度間隔である程度の偏りを示す可能性があります。これは推測にすぎませんが、要点は、これらのノイズ関数が実際には異なる周波数で組み合わされるように設計されているということです。これにより、1 オクターブで見られるパターンがバラバラになる傾向があります。

編集:

私が気付いたもう 1 つのポイントは、(1,1) などのコーナー勾配は単位長ではなく、sqrt(2) です。最初の引用は、勾配が単位円上にあることを明確にしています。これは、バイアスの別の原因である可能性があります。興味深いことに、Gustavson はこれらの非単位勾配も使用しています。

于 2014-02-05T04:38:47.970 に答える
4

パーリンノイズの値ノイズバージョンも直線を生成し、パーリンの勾配ノイズバージョンはわずかに丸いものを生成するため、勾配バージョンではなくシンプレックスの値ノイズ実装があるかもしれません。

そうしないと、象限間の角度遷移が生成されるため、コードの補間勾配が正しくありません。シンプレックス ノイズは高速であるだけでなく、勾配がより丸みを帯びているとオンラインで述べているようです。

これは、補間曲線の角度が丸くなっていることを意味すると解釈します。おそらく、誰かが Ken Perlin の声明を誤って述べているのでしょう。彼は、グラデーションのジッターが少ないと言っただけです (間違った説明を使用して申し訳ありません)。多くの Perlin を乗算すると、コードは正弦波のような完全な数学的曲線を実際には生成しないためです。ジッタ/カーブの不規則性は測定するのに十分強いことがわかりましたが、これは正弦波や数学関数には当てはまりません。そのため、シンプレックス ノイズ勾配に関する他の人のコメントをオンラインで調べることができます。

グラデーションルックアップテーブルがあると思いますが、あなたの場合は45フィートまで上がることが多いようです。形状と直線はまったくありませんが、特に CPU では計算が容易ではありません。GPU では、多項式勾配曲線よりも高速な正弦勾配が使用されるのは理にかなっていると思います。

また、シンプレックスの乱流およびマルチフラクタルなどのバージョンが何をするかを確認しましたか? いずれの場合も、ノイズ関数がどのように実行され、毎回非常に異なる結果を返すかを表す約 5 行です。

scrawkblog からの GPU の Perlin ノイズの改善 画像

于 2013-09-24T03:01:59.173 に答える