使用可能なノイズ関数を取得するために非常に多くの異なる戦略を試しましたが、どれも機能しません。では、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の「組み込み」ノイズ関数をサポートしていません。フラクタルを扱っているため、ノイズを事前に計算してテクスチャとしてインポートすることはできません。これは、実行時にノイズを計算する無限の精度が必要であることを意味します。
したがって、包括的な質問は...
どのように?