【解決方法】jpg 画像にシンプレックス ノイズが正しく表示されない


現在、ノイズを介してプロシージャル テクスチャを作成しています。 これまでのところ、プログラムが書き込むための 512 x 512 JPG 画像ファイルをセットアップしましたが、問題があります。 私が抱えている問題は、ノイズがファイルを適切に埋めていないことです。 ノイズは画像の下部だけを埋めているようです https://pasteboard.co/r3VwxscTGLNL.jpg[^]

参考までに、これは私が期待したものです/私の結果が(線に沿って)見えるようにしたいです
https://i.stack.imgur.com/X95qE.jpg[^]

これが私が使用したコードです(STBを使用して画像に書き込み、FNL(FastNoise Lite)を使用してノイズを作成しました)

C
void write_noise_2d(int w, int h, int channels_num)
{
    fnl_state noise = fnlCreateState();
    noise.noise_type = FNL_NOISE_OPENSIMPLEX2;

    unsigned char noise_data[w * h * channels_num];
    int index = 0;

    for(int x=0; x<w; x++)
    {
        for(int y=0; y<h; y++)
        {
            noise_data[index++] = fnlGetNoise2D(&noise, x, y);
        }
    }

    stbi_write_jpg("textures/noisemap.jpg", w, h, channels_num, noise_data, w * channels_num);
}

write_noise_2d(512, 512, 2);

私が試したこと:

STB と FNL の両方の公式ドキュメントを調べたり、複数のフォーラムで他の関連する投稿をチェックしたりしています。 また、カラー チャネルと画像のサイズを変更して、それが機能するかどうかを確認しました。

解決策 1

あなたのコードは配列を生成します channels_num 塗りつぶすサイズの倍。 渡された値をチェックしないため、アプリはメモリを上書きできます (指定されている場合) channels_num = 0 または、表示されていることを実行します: 配列の一部のみを埋めます ( channels_num > 1) で、もし channels_num 大きくなると、アプリはスタックを非常に迅速に吹き飛ばします。通常、スタックは1Mbに設定されているため、完全に破壊するのにそれほど時間はかかりません. コードを変更して使用する mallocfree ローカル割り当ての代わりに、全体を埋めて画像を表示します。

コメント

タイトルとURLをコピーしました