柏林噪声是一种可重复、平滑连续、可缩放的伪随机函数,适合生成自然地形与纹理;其核心是通过哈希坐标获取梯度、双线性插值及fade函数实现平滑过渡,并支持fbm多层叠加模拟多尺度特征。

用 C++ 实现简单的程序化生成,核心是用柏林噪声(Perlin Noise)生成自然、连续、可重复的伪随机地形或纹理。它比纯随机数更“有机”,适合做地形高度图、云层、火焰、纹理扰动等。
柏林噪声不是“随机”,而是:
- 可重复:相同坐标输入,永远返回相同浮点值(利于多线程或重载世界);
- 平滑连续:输出值在空间中渐变,没有突兀跳跃;
- 可缩放(octave 控制):通过叠加不同频率/振幅的噪声层(fbm),模拟山脉、小丘、岩石细节等多尺度特征。
不依赖外部库,用经典 Ken Perlin 原始思路简化实现(非最高效,但逻辑清晰):
代码片段(精简版,含注释):
#include <cmath>
#include <vector>
#include <random>
<p>class SimplexNoise { // 注:这里用“SimplexNoise”名更准确,但初学可用 Perlin 思路理解
std::vector<int> perm = { /<em> 256 个 0~255 的 shuffle 后排列 </em>/ };</p><pre class='brush:php;toolbar:false;'>float fade(float t) { return t * t * t * (t * (t * 6 - 15) + 10); }
float lerp(float a, float b, float t) { return a + t * (b - a); }
float grad(int hash, float x, float y) {
int h = hash & 3;
float u = h < 2 ? x : y;
float v = h < 2 ? y : x;
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}public:
SimplexNoise() {
std::vector }; 立即学习“C++免费学习笔记(深入)”;float noise(float x, float y) const {
int X = (int)floor(x) & 255;
int Y = (int)floor(y) & 255;
x -= floor(x); y -= floor(y);
float u = fade(x), v = fade(y);
int A = perm[X] + Y, AA = perm[A] & 255, AB = perm[A+1] & 255;
int B = perm[X+1] + Y, BA = perm[B] & 255, BB = perm[B+1] & 255;
float x1 = grad(perm[AA], x, y);
float x2 = grad(perm[BA], x-1, y);
float y1 = lerp(x1, x2, u);
float x3 = grad(perm[AB], x, y-1);
float x4 = grad(perm[BB], x-1, y-1);
float y2 = lerp(x3, x4, u);
return lerp(y1, y2, v);
}
// fbm:叠加多层噪声(octaves)
float fbm(float x, float y, int octaves = 4, float lacunarity = 2.0f, float persistence = 0.5f) const {
float total = 0.0f;
float frequency = 1.0f;
float amplitude = 1.0f;
float norm = 0.0f;
float sum = 0.0f;
for (int i = 0; i < octaves; ++i) {
sum += noise(x * frequency, y * frequency) * amplitude;
norm += amplitude;
amplitude *= persistence;
frequency *= lacunarity;
}
return sum / norm;
}
用 fbm 填充一个 128×128 的 heightmap:
height[i][j] = (fbm(i*0.03f,j*0.03f) + 0.7f) * 0.5f;;基本上就这些。从一个可运行的 fbm 函数开始,再叠加规则(如河流侵蚀、生物群系分布),就能搭建出有表现力的程序化世界。不复杂但容易忽略的是——噪声只是“原料”,真正让生成有意义的,是你怎么解释和组合它。
以上就是c++++如何实现一个简单的程序化生成(Procedural Generation)算法_c++柏林噪声应用【游戏开发】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号