簡體   English   中英

更改 Perlin 噪聲算法以使用連續程序生成

[英]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*nWidth2*nHeight的塊。 然后,您在任何 XY 位置都會有 4 個重疊的塊。 在 map 的邊緣,您將有一個條帶,其中並非所有塊都已生成。 當需要顯示 map 的這一部分時,您可以即時生成這些塊。 這會將邊緣向外移動。

平均過程已經消除了邊界效應。 您可以通過平滑其邊緣附近的每個單獨塊來使其更有效。 由於塊邊緣不重合,因此不同塊的平滑也不重合。 一個簡單的平滑三角形就足夠了(即平滑的 window 在中間為 1,在邊緣為 0,中間為線性),但您也可以使用高斯或任何其他 function 在中間達到峰值並逐漸向塊平滑邊緣。

暫無
暫無

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

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