柏林噪声是一种可重复、平滑连续、可缩放的伪随机函数,适合生成自然地形与纹理;其核心是通过哈希坐标获取梯度、双线性插值及fade函数实现平滑过渡,并支持fbm多层叠加模拟多尺度特征。
用 C++ 实现简单的程序化生成,核心是用柏林噪声(Perlin Noise)生成自然、连续、可重复的伪随机地形或纹理。它比纯随机数更“有机”,适合做地形高度图、云层、火焰、纹理扰动等。
柏林噪声不是“随机”,而是:
- 可重复:相同坐标输入,永远返回相同浮点值(利于多线程或重载世界);
- 平滑连续:输出值在空间中渐变,没有突兀跳跃;
- 可缩放(octave 控制):通过叠加不同频率/振幅的噪声层(fbm),模拟山脉、小丘、岩石细节等多尺度特征。
不依赖外部库,用经典 Ken Perlin 原始思路简化实现(非最高效,但逻辑清晰):
代码片段(精简版,含注释):
#include#include #include class SimplexNoise { // 注:这里用“SimplexNoise”名更准确,但初学可用 Perlin 思路理解 std::vector
perm = { / 256 个 0~255 的 shuffle 后排列 / }; 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 zuojiankuohaophpcn 2 ? x : y; float v = h zuojiankuohaophpcn 2 ? y : x; return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); }public: SimplexNoise() { std::vector
p(256); for (int i = 0; i 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 zuojiankuohaophpcn 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++
# 游戏开发
# 排列
# for
# int
# public
# 线程
# 多线程
# 算法
# 性能优化
# webgl
# 就能
# 的是
# 插值
# 是一种
# 随机数
# 浮点
# 你怎么
# 遍历
# 有意义
# 并与
相关文章:
建站之星免费版是否永久可用?
常州企业建站如何选择最佳模板?
如何构建满足综合性能需求的优质建站方案?
香港服务器部署网站为何提示未备案?
香港服务器如何优化才能显著提升网站加载速度?
,网站推广常用方法?
如何快速完成中国万网建站详细流程?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何在万网主机上快速搭建网站?
建站OpenVZ教程与优化策略:配置指南与性能提升
定制建站价位费用解析与套餐推荐全攻略
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
外贸公司网站制作哪家好,maersk船公司官网?
微信h5制作网站有哪些,免费微信H5页面制作工具?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
深入理解Android中的xmlns:tools属性
建站168自助建站系统:快速模板定制与SEO优化指南
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
Python如何创建带属性的XML节点
如何设置并定期更换建站之星安全管理员密码?
招贴海报怎么做,什么是海报招贴?
如何用PHP快速搭建CMS系统?
如何在阿里云服务器自主搭建网站?
如何通过云梦建站系统实现SEO快速优化?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
如何打造高效商业网站?建站目的决定转化率
香港服务器网站推广:SEO优化与外贸独立站搭建策略
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何快速生成橙子建站落地页链接?
如何在宝塔面板中创建新站点?
如何在阿里云香港服务器快速搭建网站?
为什么Go需要go mod文件_Go go mod文件作用说明
制作网站的基本流程,设计网站的软件是什么?
如何在服务器上三步完成建站并提升流量?
如何在建站之星绑定自定义域名?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
香港服务器选型指南:免备案配置与高效建站方案解析
Python lxml的etree和ElementTree有什么区别
高防服务器如何保障网站安全无虞?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何快速生成凡客建站的专业级图册?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何安全更换建站之星模板并保留数据?
*请认真填写需求信息,我们会在24小时内与您取得联系。