質問

私は (趣味として) 擬似ランダム ノイズの生成、特に Perlin アルゴリズムと Simplex アルゴリズムに興味を持っています。Simplex の利点は速度 (特に高次元で) ですが、Perlin は比較的簡単にタイル化できます。タイリングシンプレックスアルゴリズムを知っている人はいるだろうかと思ったのですが?固定次元でも問題ありませんが、汎用の方が優れています。疑似コードでも問題ありませんが、C/C++ の方が優れています。

役に立ちましたか?

解決 3

これは、この質問が合理的に解決されていると思われるここを、作業溶液<のhref =「http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/」のrel = "nofollowをnoreferrerの背後にある考え方の詳細な説明と「>ここを。長年の問題に素晴らしい答え!

他のヒント

ただ、タイルあなたの騒音あなたはパーリンにのみスキュー後にそれを行うだろうと同じ方法。あなたは、ベース隅から他の隅を得るにオフセットに追加した後、(代わりの前に)(あなたが使用しているものは何でも、または&255)のmod 256を行うためにpermutaionsを取得する部分を変更することでこれを行うことができます。これはHLSLのコードの変更ビット

uint3 iIdx0 = p0SI % 256;
uint3 iIdx1 = (p0SI + pI1) % 256;
uint3 iIdx2 = (p0SI + pI2) % 256;
uint3 iIdx3 = (p0SI + 1.0f) % 256;
uint iGI0 = gPerm[ iIdx0.x + gPerm[ iIdx0.y + gPerm[ iIdx0.z ] ] ] % 12;
uint iGI1 = gPerm[ iIdx1.x + gPerm[ iIdx1.y + gPerm[ iIdx1.z ] ] ] % 12;
uint iGI2 = gPerm[ iIdx2.x + gPerm[ iIdx2.y + gPerm[ iIdx2.z ] ] ] % 12;
uint iGI3 = gPerm[ iIdx3.x + gPerm[ iIdx3.y + gPerm[ iIdx3.z ] ] ] % 12;

p0SIは角0点であり、PI2とPI2は、通常の方法で算出された1コーナー2コーナーにベクターです。インスタンス1.0Fが実際(1.0,1.0,1.0)であるためにHLSLスカラーで混合operatons自動的にベクトルに促進することに注意してください。私はちょうどこのタイリングSTUFを考え出したが、apprentlyそれが動作します。あなたは日陰に大きな惑星やいくつかのたわごとを必要とするだけで、あなたのカードの単精度をお持ちの場合は、さらにいくつかのステップがあります。私を打ちます。

編集:あなたはそれについて考えた後、いくつかのより多くの私はあなたが何かを変更する必要はないと思います知っています。私が実装され、それが256台でautmaticallyタイルと思います。

数年が経過したにもかかわらず、この質問は依然として Google で最高の結果の 1 つに入っています。

シンプレックス ノイズでは、直線 (正規直交) グリッドの x と y が歪んで、点が存在するシンプレックス (2D の三角形) を見つけます。そのため、一般的なタイリング手法 (%255 など) を使用すると、タイル化されますが、タイル化されます。歪んだ座標、つまり「斜め」にタイルを並べるのですが、これはまったく役に立ちません。

私が見つけた簡単な解決策は、結果を「歪ませる」ことで、元の X と Y が最初に「左」に歪んでから、アルゴリズムがそれらを「右」に歪ませることで、最終的な結果は次のようになります。傾いていないグリッドに再配置されます。

たとえば、シンプレックス実装がネット上のどこにでも見つかる SimplexNoise.java に似ている場合、次を使用してグリッドを歪めます。

var F2 = 0.5*(Math.sqrt(3.0)-1.0);
var s = (xin+yin)*F2; // Hairy factor for 2D
var i = Math.floor(xin+s);
var j = Math.floor(yin+s);

メソッドのエントリ ポイントで、単純に逆方向に「プリスキュー」することができます。

var G2 = (3.0-Math.sqrt(3.0))/6.0;
var t = (xin+yin)*G2;
xin-=t;
yin-=t;

残念ながら、それはどういうわけか奇妙に見える効果 (つまり、少し歪んで見える :D ) を生成します。これは通常は問題ではありませんが、そのノイズが何に必要かによって異なります。

これは私にとって問題だったので、この「逆スキュー」を最終出力でより重みがかかる数オクターブにのみ適用し、代わりに「軽い」オクターブには補間を使用することにしました。このソリューションにより、シンプレックス パーリン ノイズに基づいた満足のいくタイリングが得られました。原因は、すべてのオクターブで補間するとタイル境界で過度の減衰が発生し、人為的なスキューなしでさらにオクターブを追加すると、見た目の効果が追加のノイズに埋もれてしまうためです。

私は最近、シンプレックスノイズをタイルに必要とこの質問に出くわします。

あらゆるノイズ関数を使用してノイズをタイリングするために、あなたは直線的に追加のタイルのサンプルを補間することができます:

Ftileable(x, y) = ( 
       F(x, y) * (w - x) * (h - y) + 
       F(x - w, y) * (x) * (h - y) + 
       F(x - w, y - h) * (x) * (y) + 
       F(x, y - h) * (w - x) * (y)
) / (wh)

ここで、F()は、あなたのノイズ関数です。なお、X、Yは、個々のタイル内の座標でなければならない:0において、X、W)、yは[0、h)に。あなたはtileX = Xのようなもの使用することができます - 。Math.Floor(X / W)*ワットまたはFMODを()

パフォーマンスが重要か、高次元のものである場合、それは次元D.のために2 ^ Dルックアップを必要とするため、これが移動するための方法ではないかもしれないそれはまた私のためにタイルの中心に向かって低い値を生成ます。

から撮影: のhttp://webstaff.itn .liu.se /〜stegu / TNM022-2005 / perlinnoiselinks /パーリンノイズ・数学-faq.htmlよくする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top