![](/img/trans.png)
[英]How to generate procedural terrain with Perlin Noise in OpenGL?
[英]Change Perlin noise algorithm to work with continuous procedural generation
現在我有一個 perlin 噪聲 function ,其中我傳遞了一個種子緩沖區和另一個緩沖區,function 用噪聲值填充。 我正在使用它來生成地形中頂點的高度。 問題是現在地形僅限於緩沖區的大小,但我想讓它連續生成塊,這些塊彼此一致,但我不知道如何使用我正在使用的當前 function 來做到這一點。 這是算法的代碼,有什么我可以改變的嗎?
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;
}
}
}
大概這與“地圖顯示”機制有關?
一種常見的技術是生成重疊的塊並將它們平均在一起。 作為一個簡單的示例,您生成2*nWidth
乘2*nHeight
的塊。 然后,您在任何 XY 位置都會有 4 個重疊的塊。 在 map 的邊緣,您將有一個條帶,其中並非所有塊都已生成。 當需要顯示 map 的這一部分時,您可以即時生成這些塊。 這會將邊緣向外移動。
平均過程已經消除了邊界效應。 您可以通過平滑其邊緣附近的每個單獨塊來使其更有效。 由於塊邊緣不重合,因此不同塊的平滑也不重合。 一個簡單的平滑三角形就足夠了(即平滑的 window 在中間為 1,在邊緣為 0,中間為線性),但您也可以使用高斯或任何其他 function 在中間達到峰值並逐漸向塊平滑邊緣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.