C++ 将Perlin噪波算法更改为使用连续程序生成

C++ 将Perlin噪波算法更改为使用连续程序生成,c++,buffer,noise,random-seed,C++,Buffer,Noise,Random Seed,现在我有一个柏林噪声函数,我传递一个种子缓冲区和另一个缓冲区,该函数用噪声值填充。我使用这个程序生成地形中顶点的高度。现在的问题是,地形仅限于缓冲区的大小,但我想让它连续生成块,块彼此一致,但我不知道如何使用当前使用的函数实现这一点。这是算法的代码,有什么我可以修改的吗 inline void perlInNoise2D(int nWidth,int nHeight, float *Seed, int nOctaves, float fBias, float *fOutput) { fo

现在我有一个柏林噪声函数,我传递一个种子缓冲区和另一个缓冲区,该函数用噪声值填充。我使用这个程序生成地形中顶点的高度。现在的问题是,地形仅限于缓冲区的大小,但我想让它连续生成块,块彼此一致,但我不知道如何使用当前使用的函数实现这一点。这是算法的代码,有什么我可以修改的吗

inline void perlInNoise2D(int nWidth,int nHeight, float *Seed, int nOctaves, float fBias, float *fOutput)
{
    for(int x = 0; x < nWidth; x++)
    {
        for(int y = 0; y < nHeight; y++)
        {
            float fNoise = 0.0f;
            float fScale = 1.0f;
            float fScaleAccum = 0.0f;
            for(int o = 0; o < nOctaves;o++)
            {                    
                int nPitch = nWidth >> o; 
                
                int sampleX1 = (x / nPitch) * nPitch;
                int sampleY1 = (y / nPitch) * nPitch;

                int sampleX2 = (sampleX1 + nPitch) % nWidth;
                int sampleY2 = (sampleY1 + nPitch) % nWidth;

                float fBlendX = (float)(x - sampleX1) / (float) nPitch;
                float fBlendY = (float)(y - sampleY1) / (float) nPitch;
                
                float fSampleT = (1.0f - fBlendX) * Seed[sampleY1 * nWidth + sampleX1] + fBlendX * Seed[sampleY1 * nWidth + sampleX2];
                float fSampleB = (1.0f - fBlendX) * Seed[sampleY2 * nWidth + sampleX1] + fBlendX * Seed[sampleY2 * nWidth + sampleX2];

                fNoise += (fBlendY * (fSampleB - fSampleT) + fSampleT) * fScale;

                fScaleAccum += fScale;

                fScale = fScale / fBias;
            }
            fOutput[(y * nWidth) + x] = fNoise / fScaleAccum;
        }
    }
}
inline void perlInNoise2D(int nWidth、int nHeight、float*Seed、int nOctaves、float fBias、float*fOutput)
{
对于(int x=0;x>o;
int sampleX1=(x/nPitch)*nPitch;
int sampleY1=(y/nPitch)*nPitch;
int sampleX2=(sampleX1+nPitch)%nWidth;
int sampleY2=(sampleY1+nPitch)%nWidth;
float fBlendX=(float)(x-sampleX1)/(float)nPitch;
float fBlendY=(float)(y-样本1)/(float)nPitch;
浮点fSampleT=(1.0f-fBlendX)*种子[sampleY1*nWidth+sampleX1]+fBlendX*种子[sampleY1*nWidth+sampleX2];
浮点fSampleB=(1.0f-fBlendX)*种子[sampleY2*nWidth+sampleX1]+fBlendX*种子[sampleY2*nWidth+sampleX2];
fNoise+=(fBlendY*(fSampleB-fSampleT)+fSampleT)*fScale;
fScaleAccum+=fScale;
fScale=fScale/fBias;
}
fOutput[(y*nWidth)+x]=fNoise/fscaleacum;
}
}
}

这可能与“地图显示”机制有关

一种常见的技术是生成重叠块并将它们平均在一起。作为一个简单的例子,您可以通过
2*nHeight
生成
2*nWidth
块。然后在任意XY位置有4个重叠块。在地图的边缘,有一个条带,其中没有生成所有块。当需要显示地图的这一部分时,您可以动态生成这些块。这会将边缘向外移动


平均过程已经平滑了边界效果。通过平滑边缘附近的每个块,可以使此操作更加有效。由于块边缘不重合,不同块的平滑也不重合。一个简单的三角形平滑可以是足够的(即,平滑的窗口是中间的1,边缘的0,和线性的),但是你也可以使用高斯或任何其他函数,这些函数在中间达到峰值,并逐渐向块边缘平滑。

每次生成新的块时,我需要提供一个不同的种子映射吗?例如,如果我走到地图的边缘,在再次调用柏林噪波函数时,已经加载的两个块正在使用,并且生成了两个新的块。可能你想要不同的地形,所以是的。但由于这会影响看不见的地形,因此可以延迟拾取种子。