簡體   English   中英

Perlin Noise 2D:將靜態變成雲

[英]Perlin Noise 2D: turning static into clouds

我想把我的頭包裹在Perlin的噪音周圍。

本文有所幫助,我一直在嘗試重新創建它提供的雲類型映像。

我的噪音代碼如下:

#include "terrain_generator.hpp"

using namespace std;


#define PI 3.1415927;

float noise(int x, int y)
{
    int n = x + y * 57;
    n = (n<<13) ^ n;
    return (1.0 - ( (n * ((n * n * 15731) + 789221) +  1376312589) & 0x7fffffff) / 1073741824.0);
}

float cosine_interpolate(float a, float b, float x)
{
    float ft = x * PI;
    float f = (1 - cos(ft)) * 0.5;
    float result =  a*(1-f) + b*f;
    return result;
}

float smooth_noise_2D(float x, float y)
{  
    float corners = ( noise(x-1, y-1)+noise(x+1, y-1)+noise(x-1, y+1)+noise(x+1, y+1) ) / 16;
    float sides   = ( noise(x-1, y)  +noise(x+1, y)  +noise(x, y-1)  +noise(x, y+1) ) /  8;
    float center  =  noise(x, y) / 4;

    return corners + sides + center;
}

float interpolated_noise(float x, float y)
{
    int x_whole = (int) x;
    float x_frac = x - x_whole;

    int y_whole = (int) y;
    float y_frac = y - y_whole;

    float v1 = smooth_noise_2D(x_whole, y_whole); 
    float v2 = smooth_noise_2D(x_whole, y_whole+1); 
    float v3 = smooth_noise_2D(x_whole+1, y_whole); 
    float v4 = smooth_noise_2D(x_whole+1, y_whole+1); 

    float i1 = cosine_interpolate(v1,v3,x_frac);
    float i2 = cosine_interpolate(v2,v4,x_frac);

    return cosine_interpolate(i1, i2, y_frac);
}


float perlin_noise_2D(float x, float y)
{
    int octaves=5;
    float persistence=0.5;
    float total = 0;

    for(int i=0; i<octaves-1; i++)
    {
        float frequency = pow(2,i);
        float amplitude = pow(persistence,i);
        total = total + interpolated_noise(x * frequency, y * frequency) * amplitude;
    }
    return total;
}

為了實際實現該算法,我正在嘗試使他在文章中描述的烏雲密布。

我正在使用openGL,正在制作自己的紋理並將其粘貼到覆蓋屏幕的四邊形上。 但這無關緊要。 在下面的代碼中,只知道set pixel函數可以正常工作,並且其參數為(x, y, red, green, blue)

本質上這是我的繪制循環:

for(int y=0; y<texture_height; y++)
{
    for(int x=0; x<texture_width; x++)
    {
        seed2+=1;
        float Val=perlin_noise_2D(x,y);
        Val = Val/2.0;
        Val = (Val + 1.0) / 2.0; 
        setPixel(x,y,Val,Val,Val);
    }
}

我得到的是以下內容:

在此處輸入圖片說明

如何操縱算法以達到所需的效果? 更改持久性或八度的數量似乎並沒有多大作用。

由於您的結果看起來幾乎像白噪聲,因此您的樣品在珀林噪聲內可能相距太遠。 嘗試使用小於像素坐標的值來評估噪聲。

類似於以下內容:

perlin_noise_2D((float)x/texture_width,(float)y/texture_height);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM