4

使用可能なノイズ関数を取得するために非常に多くの異なる戦略を試しましたが、どれも機能しません。では、GLSLのATIグラフィックカードにパーリンノイズをどのように実装しますか?

私が試した方法は次のとおりです。順列とグラデーションのデータをGL_RGBA1Dテクスチャに入れて、texture1D関数を呼び出してみました。ただし、このノイズ実装への1回の呼び出しは、12回のテクスチャ呼び出しにつながり、フレームレートを強制終了します。

順列と勾配のデータを均一なvec4配列にアップロードしようとしましたが、インデックスが定数でない限り、コンパイラーは配列内の要素を取得できません。例えば:

int i = 10;
vec4 a = noise_data[i];

これのコンパイラエラーが発生します:

エラー:0:43:一時配列間接インデックスを使用する場合はサポートされません。

つまり、次のようなデータしか取得できません。

vec4 a = noise_data[10];

また、配列をシェーダーに直接プログラミングしようとしましたが、同じインデックスの問題が発生しました。NVIDIAグラフィックカードは実際にこの方法を許可すると聞いていますが、ATIは許可していません。

入力インデックスに応じて特定のハードコードされたデータポイントを返す関数を作成しようとしましたが、この関数は12回呼び出され、64個のifステートメントを持っているため、リンク時間が耐えられませんでした。

ATIはglslの「組み込み」ノイズ関数をサポートしていません。フラクタルを扱っているため、ノイズを事前に計算してテクスチャとしてインポートすることはできません。これは、実行時にノイズを計算する無限の精度が必要であることを意味します。

したがって、包括的な質問は...

どのように?

4

5 に答える 5

2

GLSLノイズ関数を使用したプロジェクトがgithubにあります。これは、2、3、および4Dの「クラシック」ノイズ機能と新しいノイズ機能の両方を備えています。

IOSにnoise機能が実装されています。

于 2013-01-12T21:58:39.477 に答える
2

ランダム値のより良い分布のために、私はこれらの非常に良い記事を提案します:

  1. GLSLの疑似乱数ジェネレータ
  2. ルミナノイズGLSLチュートリアル

ランダムに楽しんでください!!!

于 2010-09-03T15:46:34.650 に答える
1

noise()は、実装されていないことでよく知られています。

あなたが所有するロール:

int c;
int Xn;
srand(int x, int y, int width){// in pixel
    c = x+y*width;
};

int rand(){
    Xn = (a*Xn+c)%m;
    return Xn;
}

aとmの値については、ウィキペディアを参照してください。

完璧ではありませんが、多くの場合十分です。

于 2010-08-30T08:36:46.773 に答える
0

このSimpleXノイズは、あなたが望むことをするかもしれません。

于 2010-08-28T05:36:37.690 に答える
-1

シェーダーの上部に#version150を追加してみてください。

于 2010-08-29T09:52:02.573 に答える