柏林噪声

柏林噪声算法(Perlin Noise)是Ken Perlin在1983年提出的一种渐变噪声。和完全随机的白噪声相比,柏林噪声做到了杂乱而有序。能够更好地模拟自然界中的随机现象的复杂性和相互间的关联性,常被用于电影视觉效果。

a. 一维柏林噪声

  • 随机出一些散点;
  • 对这些点进行插值获得连续的曲线;
  • 用Unity的GL屏幕划线写了一下,这里用的插值函数是

b. 二维柏林噪声

  • 首先定义一个晶格结构,二维的情况下就是一个网格结构。并且为每个晶格顶点赋予一个"伪随机"的梯度向量;

  • 对于每个二维坐标点,找到与其相邻的4个晶格顶点,计算该点到各个晶格顶点的距离向量;

  • 四个距离向量分别与对应的梯度向量做点乘,得到点乘结果;

  • 最后使用缓和曲线(ease curves)对点乘结果做插值求权重和;

  • 效果如下:

一些细节

 插值函数

  • 最原始的插值函数使用的是:;函数的二阶导数就是一阶导数的变化率,在图形上主要表现为函数图像的凹凸性,而它的二阶导数  在  和  时均不等于0。那么相邻的晶格处的二阶导并不连续,使得在使用噪声的导数时,将导致出现失真的效果,例如制作凹凸贴图(凹凸贴图表面的光照效果随相应的高度函数的导数而变,所以二阶导数的不连续性是可以看见的)。
  • Perlin在2002发表的论文做了改进,改用5次样条做插值:,它在  和  处的  阶导数均为 


晶格顶点与坐标

以三维空间为例,设三维空间中的任意一点为 :空间中的晶格坐标为,其坐标都是整数;

  • 定义一点的坐标为一个整数加上小数部分,
  • 那么围绕该点的单位立方体晶格为:

  • 将计算过程中的坐标范围映射到满足上述要求的范围内,比较方便计算。

伪随机梯度向量

  • 在选择晶格顶点的梯度向量的预处理阶段,我们可以借助一些随机函数,在单位正方形(二维)/单位立方体(三维)内生成梯度向量的各个分量,然后剔除那些不在单位圆(二维)/单位球(三维)内的向量,直至找到了所需数目的随机梯度向量。  将得到的梯度向量存储在一个查找表里,假设晶格的坐标,并且,那么 
  • 照常理来说,二维下需要个梯度向量,三维下需要个梯度向量,只有个的情况下势必会有重复。但Perlin认为重复是可以接受的,只要它们的间距足够大就不会被察觉。
  • 除此之外,Perlin还预先生成了一个大小为的随机排列数组,里面存储的是乱序排列的0到的值。
  • 对于三维空间中的某一点坐标,可以获取相对应的晶格:

  • 在后续的改进中,Perlin改用12个伪随机斜率代替256个,它们由立方体的12条棱的中点组成:,这样可以改善“污点”使其更少。

a.旧的噪声            b.较少污点的噪声
  • 改善的原因是,相近的梯度向量如果挤在一起,使用噪声函数实现就会出现污点的情况,而12个斜率的方向是均匀分布的,不会挤在一起。
  • 另外一点,该方法提升了运算效率,因为它可以避免乘法运算,如  和  的点积可以按照  做加法。

wikipedia
https://en.wikipedia.org/wiki/Perlin_noise
Perlin2002年的论文
https://mrl.nyu.edu/~perlin/paper445.pdf
前面是对Perlin Noise详细的讲解,后面是与fbm(分形噪声)的结合
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://www.jianshu.com/p/987b1349c94d
可平铺的Perlin噪声 
https://www.gamedev.net/blogs/entry/2138456-seamless-noise/
http://ronvalstar.nl/creating-tileable-noise-maps
乐乐女神对噪声的整理(Perlin,Value,Simplex,Fractal(fbm))
https://blog.csdn.net/candycat1992/article/details/50346469 

【GPU Gems 学习笔记】Implementing Improved Perlin Noise相关推荐

  1. 【GPU Gems 学习笔记】Rendering Water Caustics

    一. 水的焦散 焦散(Caustic),是一种光学现象,是由于光线在曲面经过反射或折射后形成的聚光效果,类似于凸透镜效果. 对于不透明物体来说,当光线照射到具有强反射属性的曲面对象时,会形成反射焦散现 ...

  2. PYRIT 强大的密码分析工具(可使用GPU分析)-学习笔记

    优势: 可运用GPU的运算加速生成PMK 本身支持抓包获取四步五首过程,无需用Airodump抓包 也支持传统的读取airodump抓包获取四步握手的方式 只抓取WAP四次握手过程包 pyrit -r ...

  3. 学习笔记:Improved Techniques for Training GANs理解

    论文链接:https://arxiv.org/abs/1606.03498 这是一篇对GAN的训练作出改进的文章,众所周知,GAN的训练是极其不稳定的.转载请注明. 1 主要内容 对GAN网络提出一些 ...

  4. 【GPU精粹与Shader编程】(五) 《GPU Gems 2》全书核心内容提炼总结 · 下篇

                                 本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处                             文章链接: https:/ ...

  5. PVTV2--Pyramid Vision TransformerV2学习笔记

    PVTV2–Pyramid Vision TransformerV2学习笔记 PVTv2: Improved Baselines with Pyramid Vision Transformer Abs ...

  6. 木木的Unity学习笔记(四)—— Unity中的柏林噪声(Perlin Noise)

    木木的Unity学习笔记(四)-- Unity中的柏林噪声 柏林噪声是一个非常强大算法,经常用于程序生成随机内容,在游戏和其他像电影等多媒体领域广泛应用.算法发明者Ken Perlin也因此算法获得奥 ...

  7. Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题

    Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 参考文章: (1)Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 (2)http ...

  8. Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)

    0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...

  9. 《基于GPU加速的计算机视觉编程》学习笔记

    <基于GPU加速的计算机视觉编程>学习笔记(1) 最近打算 准备工作 CUDA开发环境(主要是查看N卡的信息) 在WIN10下安装CUDA工具包 最近打算 在训练模型的时候,感觉电脑非常吃 ...

最新文章

  1. Android中Broadcast
  2. Linux环境下段错误的产生原因及调试方法小结
  3. eclipse 提交git失败_简单10步教你使用eclipse整合gitee码云实现共享开发
  4. TP5 验证码功能实现(解决点击验证码不更新的问题)
  5. MDP马尔可夫决策过程(二)
  6. php 上传类 缩略图,php图片文件上传类 (附自动生成缩略图) | 学步园
  7. 如何设计一道优雅的白名单策略
  8. 剑指offer面试题[24]-二插搜索树的后序遍历序列
  9. Linux中grep命令查找文件,Linux中使用grep命令搜索文件名及文件内容的方法
  10. nfs--samba
  11. Java并发编程实战 -- 读书笔记
  12. 软件测试面试题(二):Jmeter面试
  13. app浮层html,App设计之五:弹窗与浮层
  14. 电脑系统pe去广告及恶意软件安装
  15. Excel如何合并单元格
  16. 如何用burpsuite和手机模拟器给apk抓包
  17. 【JS学习笔记】2.JavaScript变量
  18. return返回值详解
  19. 南大通用数据库-Gbase-8a-学习-14-LOAD加载数据
  20. 手把手教你做多重线性逐步回归

热门文章

  1. Portrait Matting(人像分割)研究日记...未完成..进行中...
  2. Echarts构建厂图(地图等类型)
  3. 保险nbsp;车险险种及说明
  4. ApacheDS无法启动,导致Knox无法登陆,用户名和密码都是正确的。
  5. CCF认证2014032-窗口
  6. jsp+ssm计算机毕业设计大方汽车租赁管理系统【附源码】
  7. 解决 Xcode下使用公用静态库,出现的Duplicate Symbol错误
  8. javascript实现用户名是否存在的实时提醒
  9. 手把手教会你KMP算法
  10. 浅谈Javac编译原理