Perlin Noise 程序化纹理生成器
Perlin Noise 程序化纹理生成器
本项目代码已托管至 GitHub
每日编程实践项目,记录每天的编程学习和实践。
https://github.com/chiuhoukazusa/daily-coding-practice/tree/main/2026-02-10-perlin-noise
项目简介
今天实现了经典的 Perlin Noise 算法,用于生成自然的程序化纹理。这是图形学中非常重要的技术,可以生成云层、大理石、木纹等多种自然纹理。
- 开发时间:约 10 分钟
- 代码量:230 行 C++
- 编译状态:✅ 一次编译成功(0 错误 0 警告)
- 运行结果:✅ 成功生成 3 种纹理
技术要点
Perlin Noise 算法
Perlin Noise 是由 Ken Perlin 在 1983 年发明的噪声生成算法,它能产生连续、自然的随机值。核心特点:
- 梯度噪声:基于网格点的随机梯度向量
- 平滑插值:使用 fade 函数(6t⁵ - 15t⁴ + 10t³)确保连续性
- 可重复性:使用排列表实现伪随机
Octave Noise(多层噪声)
通过叠加不同频率和振幅的噪声层,创造出更复杂的细节:
1 | double octaveNoise(double x, double y, int octaves, double persistence) { |
三种纹理实现
- 云层纹理:8 层噪声叠加,模拟自然云层的柔和渐变
- 大理石纹理:噪声 + 正弦波扰动,产生大理石的纹理效果
- 木纹纹理:径向距离 + 环状图案,模拟木材的年轮
生成效果
云层纹理

大理石纹理

木纹纹理

编译运行
1 | # 编译 |
核心代码
Fade 函数(平滑插值)
1 | double fade(double t) { |
这个函数确保了噪声值的平滑过渡,避免了明显的网格痕迹。
梯度计算
1 | double grad(int hash, double x, double y) { |
梯度函数根据哈希值选择不同的梯度方向,产生更自然的噪声分布。
Perlin Noise 主函数
1 | double noise(double x, double y) { |
程序化纹理生成
云层纹理:
1 | for (int octave = 0; octave < 8; octave++) { |
大理石纹理:
1 | double n = octaveNoise(x * 0.05, y * 0.05, 4, 0.5); |
木纹纹理:
1 | double distance = sqrt(dx * dx + dy * dy); |
技术栈
- 语言:C++17
- 编译器:g++ with -O2 optimization
- 输出格式:PPM (Portable Pixmap)
- 图片尺寸:512×512
学习收获
- 理解了 Perlin Noise 的核心原理:梯度噪声 + 平滑插值
- 掌握了 Octave Noise 技术:通过叠加不同频率的噪声创造细节
- 实践了程序化纹理生成:用数学公式创造自然纹理
- 优化了代码性能:使用排列表和位运算提升效率
下一步计划
- 扩展到 3D Perlin Noise
- 实现 Simplex Noise(更高维度的改进版)
- 尝试生成更多类型的纹理(如火焰、水面等)
- 集成到图形渲染管线中
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Chiuhou个人博客!
