パーリンノイズとは?

パーリンノイズ(Perlin Noise)は、コンピュータグラフィックスやプロシージャル生成において使用されるアルゴリズムで、

自然に見えるランダムなパターンを生成するための手法です。

このアルゴリズムは、1983年にケン・パーリン(Ken Perlin)氏によって開発されました。

ゲーム開発においては主にテクスチャ生成や地形生成に利用されます。

Unityでパーリンノイズを使用する

Unityでは、Mathf.PerlinNoiseで使用できます。

2Dのテクスチャがあると思ってください。

そのテクスチャに対して、Mathf.PerlinNoiseに対してX,Y座標を0.0〜1.0の範囲で渡し、0.0〜1.0の範囲でランダムな値を取得するイメージです。

以下の様なコードを用意してみました。

private void Awake()
{
    for (int i = 0; i < 10; i++)
    {
        var random = Mathf.PerlinNoise(i / 10f, 0);
        
        Debug.Log($"{i:00} - {random}");
    }
}

結果は以下の様になりました。

一見ランダムですが連続性を感じます。

00 - 0.4652731
01 - 0.5269319
02 - 0.5610789
03 - 0.5575994
04 - 0.520944
05 - 0.4652731
06 - 0.4096021
07 - 0.3729467
08 - 0.3694672
09 - 0.4036145

ランダムとの違い

Unityで乱数を使用する場合、UnityEngine.Randomを使うことが多いと思います。

Randomは、単純にある範囲の値からランダムに値を選びます。

連続性や滑らかさはありません。

一方パーリンノイズは、ランダムでありながら連続的で滑らかに変化します。

結果をテクスチャ上に書き出してみる。

以下の様なコードを用意して、テクスチャに書き込み、RawImageとして表示してみます。

_texture = new Texture2D(256, 256);
_rawImage.texture = _texture;

for (int y = 0; y < 256; y++)
{
    for (int x = 0; x < 256; x++)
    {
        var random = Mathf.PerlinNoise(x / 10f, y / 10f);
        _texture.SetPixel(x, y, new Color(random, random, random));
    }
}
_texture.Apply();

以下のようになりました。

ちょっと引数を変更してみると

var random = Mathf.PerlinNoise(x / 100f, y / 100f);
_texture.SetPixel(x, y, new Color(random, random, random));

以下の様になりました。

ランダムですが、0.0〜1.0(黒い部分から白い部分)へ滑らかに変化しているのが分かると思います。

ちなみにRandom.valueにしてみると以下の様になります。

for (int y = 0; y < 256; y++)
{
    for (int x = 0; x < 256; x++)
    {
        var random = UnityEngine.Random.value;
        _texture.SetPixel(x, y, new Color(random, random, random));
    }
}

_texture.Apply();

こちらの場合、滑らかさが感じられませんね。

まとめ

今回はパーリンノイズについて解説しました。

パーリンノイズは主に雲や水面といった自然物の表現によく使用されます。

また、ランダムかつ滑らかさな変化を利用してMinecraftの地形生成のような表現にも使えます。

ランダムにしたいけど滑らかに変化させたいという場合に活用してみてください。

🔗関連ページ