【GPU Gems 学习笔记】Implementing Improved Perlin Noise
柏林噪声
柏林噪声算法(Perlin Noise)是Ken Perlin在1983年提出的一种渐变噪声。和完全随机的白噪声相比,柏林噪声做到了杂乱而有序。能够更好地模拟自然界中的随机现象的复杂性和相互间的关联性,常被用于电影视觉效果。
a. 一维柏林噪声
- 随机出一些散点;
- 对这些点进行插值获得连续的曲线;
- 用Unity的GL屏幕划线写了一下,这里用的插值函数是
b. 二维柏林噪声
- 首先定义一个晶格结构,二维的情况下就是一个网格结构。并且为每个晶格顶点赋予一个"伪随机"的梯度向量;
- 对于每个二维坐标点,找到与其相邻的4个晶格顶点,计算该点到各个晶格顶点的距离向量;
- 四个距离向量分别与对应的梯度向量做点乘,得到点乘结果;
- 最后使用缓和曲线(ease curves)对点乘结果做插值求权重和;
- 效果如下:
一些细节
插值函数
- 最原始的插值函数使用的是:;函数的二阶导数就是一阶导数的变化率,在图形上主要表现为函数图像的凹凸性,而它的二阶导数 在 和 时均不等于0。那么相邻的晶格处的二阶导并不连续,使得在使用噪声的导数时,将导致出现失真的效果,例如制作凹凸贴图(凹凸贴图表面的光照效果随相应的高度函数的导数而变,所以二阶导数的不连续性是可以看见的)。
- Perlin在2002发表的论文做了改进,改用5次样条做插值:,它在 和 处的 , 阶导数均为 。
晶格顶点与坐标
以三维空间为例,设三维空间中的任意一点为 :空间中的晶格坐标为,其坐标都是整数;
- 定义一点的坐标为一个整数加上小数部分,;
- 那么围绕该点的单位立方体晶格为:
- 将计算过程中的坐标范围映射到满足上述要求的范围内,比较方便计算。
伪随机梯度向量
- 在选择晶格顶点的梯度向量的预处理阶段,我们可以借助一些随机函数,在单位正方形(二维)/单位立方体(三维)内生成梯度向量的各个分量,然后剔除那些不在单位圆(二维)/单位球(三维)内的向量,直至找到了所需数目的随机梯度向量。 将得到的梯度向量存储在一个查找表里,假设晶格的坐标,并且,那么 。
- 照常理来说,二维下需要个梯度向量,三维下需要个梯度向量,只有个的情况下势必会有重复。但Perlin认为重复是可以接受的,只要它们的间距足够大就不会被察觉。
- 除此之外,Perlin还预先生成了一个大小为的随机排列数组,里面存储的是乱序排列的0到的值。
- 对于三维空间中的某一点坐标,可以获取相对应的晶格:
- 在后续的改进中,Perlin改用12个伪随机斜率代替256个,它们由立方体的12条棱的中点组成:,这样可以改善“污点”使其更少。
- 改善的原因是,相近的梯度向量如果挤在一起,使用噪声函数实现就会出现污点的情况,而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相关推荐
- 【GPU Gems 学习笔记】Rendering Water Caustics
一. 水的焦散 焦散(Caustic),是一种光学现象,是由于光线在曲面经过反射或折射后形成的聚光效果,类似于凸透镜效果. 对于不透明物体来说,当光线照射到具有强反射属性的曲面对象时,会形成反射焦散现 ...
- PYRIT 强大的密码分析工具(可使用GPU分析)-学习笔记
优势: 可运用GPU的运算加速生成PMK 本身支持抓包获取四步五首过程,无需用Airodump抓包 也支持传统的读取airodump抓包获取四步握手的方式 只抓取WAP四次握手过程包 pyrit -r ...
- 学习笔记:Improved Techniques for Training GANs理解
论文链接:https://arxiv.org/abs/1606.03498 这是一篇对GAN的训练作出改进的文章,众所周知,GAN的训练是极其不稳定的.转载请注明. 1 主要内容 对GAN网络提出一些 ...
- 【GPU精粹与Shader编程】(五) 《GPU Gems 2》全书核心内容提炼总结 · 下篇
本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处 文章链接: https:/ ...
- PVTV2--Pyramid Vision TransformerV2学习笔记
PVTV2–Pyramid Vision TransformerV2学习笔记 PVTv2: Improved Baselines with Pyramid Vision Transformer Abs ...
- 木木的Unity学习笔记(四)—— Unity中的柏林噪声(Perlin Noise)
木木的Unity学习笔记(四)-- Unity中的柏林噪声 柏林噪声是一个非常强大算法,经常用于程序生成随机内容,在游戏和其他像电影等多媒体领域广泛应用.算法发明者Ken Perlin也因此算法获得奥 ...
- Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题
Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 参考文章: (1)Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 (2)http ...
- Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...
- 《基于GPU加速的计算机视觉编程》学习笔记
<基于GPU加速的计算机视觉编程>学习笔记(1) 最近打算 准备工作 CUDA开发环境(主要是查看N卡的信息) 在WIN10下安装CUDA工具包 最近打算 在训练模型的时候,感觉电脑非常吃 ...
最新文章
- Android中Broadcast
- Linux环境下段错误的产生原因及调试方法小结
- eclipse 提交git失败_简单10步教你使用eclipse整合gitee码云实现共享开发
- TP5 验证码功能实现(解决点击验证码不更新的问题)
- MDP马尔可夫决策过程(二)
- php 上传类 缩略图,php图片文件上传类 (附自动生成缩略图) | 学步园
- 如何设计一道优雅的白名单策略
- 剑指offer面试题[24]-二插搜索树的后序遍历序列
- Linux中grep命令查找文件,Linux中使用grep命令搜索文件名及文件内容的方法
- nfs--samba
- Java并发编程实战 -- 读书笔记
- 软件测试面试题(二):Jmeter面试
- app浮层html,App设计之五:弹窗与浮层
- 电脑系统pe去广告及恶意软件安装
- Excel如何合并单元格
- 如何用burpsuite和手机模拟器给apk抓包
- 【JS学习笔记】2.JavaScript变量
- return返回值详解
- 南大通用数据库-Gbase-8a-学习-14-LOAD加载数据
- 手把手教你做多重线性逐步回归
热门文章
- Portrait Matting(人像分割)研究日记...未完成..进行中...
- Echarts构建厂图(地图等类型)
- 保险nbsp;车险险种及说明
- ApacheDS无法启动,导致Knox无法登陆,用户名和密码都是正确的。
- CCF认证2014032-窗口
- jsp+ssm计算机毕业设计大方汽车租赁管理系统【附源码】
- 解决 Xcode下使用公用静态库,出现的Duplicate Symbol错误
- javascript实现用户名是否存在的实时提醒
- 手把手教会你KMP算法
- 浅谈Javac编译原理