11

厳密にFP16制限を持つコンパクトでシンプルなノイズ関数を作成しようとしています。これは私がこれまでに出てきたものですが、操作のどこかで数値がfractまたはsinに対して小さすぎると思います。GPU では、これらがFP16の制限内にあるためにこれを記述する必要があるためです。私が間違っていることについてのアイデアはありますか?ところで、時間変数もサンプル ノイズ テクスチャも使用できません。私が正しく取得する必要がある関数は、コンパクトで小さく、自己完結型であり、単純な粒子の粗いノイズ効果を生成する必要があります。注: 次のアルゴリズムはどのデスクトップ GPU カードでも問題なく動作しますが、「 MALI 400 MP 」 GPU では完全に失敗します。これは浮動小数点値に FP16 制限があるためです。

vec3 noise(vec3 color)
{
    float variation = length(color);
    float dot_product = dot(variation, -0.577350269);
    float sin_result = sin(dot_product) * 1.19245;
    float random = fract(sin_result);
    return color + vec3(random);
}

GLSL-ESの他のランダム関数を推奨できますが、厳密にはFP16制限がある場合も素晴らしいでしょう。シンプレックス ノイズなどの他のランダムな実装については知っていますが、これらは大きすぎて処理速度が遅すぎます。したがって、パーリンおよびシンプレックスノイズ アルゴリズムはオプションではありません。

4

3 に答える 3