perlin噪声函数
许多人在他们的程序中使用“随机数产生器”,以使得物体的运动行为更加自然,或者用来生成纹理。随机数产生器在一些情况下很有用,但是它们生成的结果和自然结果相比,往往显得比较粗糙和生硬。这篇文章介绍使用广泛的Perlin函数,它常用在模拟自然物体的地方,比如地形,海水等。
自然物体通常是分形的,有各种各样的层次细节,比如山的轮廓,通过高度区分就有高山(mountain,高度变化大)、山丘(hill,高度变化适中)、巨石(高度变化小) 、石头(高度变化很小)等。另外,比如草地、海浪、跑动的蚂蚁、摇晃的树枝、风、大理石的花纹等等,这些都呈现出了或大或小的细节变化。Perlin噪声函数通过噪声函数来模拟这些自然景观。
要构造一个Perlin函数,你首先需要一个噪声函数和一个插值函数。
1、 噪声函数
噪声函数本质上就是一个基于种子的随机数产生器。输入参数为一个整数,输出结果为基于输入参数的随机数。如果你两次输入同样的参数,则结果都是一样的。
左上图是一个噪声函数例子,它的输出值范围是[0,1],分布范围在x轴上。右上图是通过光滑插值函数处理后的结果。
在进一步学习Perlin函数之前,我们先看一些定义,其实这些都是高中物理的概念,很简单。比如上图的正弦波,波长(Wavelength)就是两个波谷指尖的距离,频率就是1/Wavelength,波幅(Amplitude)就是波的高度。
2、 创建Perlin噪音函数
假如现在你有各种各样不同频率和幅度的光滑函数(smooth function),把他们组合在一起,就能产生一个比较好的Perlin噪声函数。
组合在一起后的效果如下图,是不是很类似山的形状,确实很多3d程序中的地形就是利用2维的噪声函数。
下面我们看看单个2维光滑函数,组合在一起形成的2维噪声函数:
下面是各个函数组合在一起的效果:
我们现在比较关注,把这些噪声函数叠加在一起时候,如何选择他们的频率和幅度?在上面一维的例子中,后面的每个函数的频率是前面的2倍,幅度是前面1/2,通常是这样来做,你也可以自己尝试其它的频率和幅度的组合,看看效果如何,比如对于小山丘,你可以使用大幅度低频率以及小幅度高频率,看看生成的山丘又何不同,甚至你可以用地频率低幅度生成岩石表面。
通常定义Persistence为幅度/频率,这是分形几何的发明人Mandelbrot创造的。Matt也定义Persistence的概念,而且更加直观,它的定义如下:
frequency = 2i
amplitude = persistencei
i表示增加的第i个噪声函数,下面的图很好的解释了这个概念:
Frequency |
1 |
|
2 |
|
4 |
|
8 |
|
16 |
|
32 |
|
||
Persistence = 1/4 |
+ |
+ |
+ |
+ |
+ |
= |
||||||||
Amplitude: |
1 |
1/4 |
1/16 |
1/64 |
1/256 |
1/1024 |
result |
|||||||
|
||||||||||||||
Persistence = 1/2 |
+ |
+ |
+ |
+ |
+ |
= |
||||||||
Amplitude: |
1 |
1/2 |
1/4 |
1/8 |
1/16 |
1/32 |
result |
|||||||
|
||||||||||||||
Persistence = 1 / root2 |
+ |
+ |
+ |
+ |
+ |
= |
||||||||
Amplitude: |
1 |
1/1.414 |
1/2 |
1/2.828 |
1/4 |
1/5.656 |
result |
|||||||
|
||||||||||||||
Persistence = 1 |
+ |
+ |
+ |
+ |
+ |
= |
||||||||
Amplitude: |
1 |
1 |
1 |
1 |
1 |
1 |
result |
Octaves(倍频函数):
我们增加的函数称作octave函数.,主要是因为后面的每个函数都是前面函数频率的2倍。增加octave函数的数量取决于你。这儿我给的建议是:如果你用Perlin函数渲染图形图像,记住太高的频率可能不能显示,因为屏幕像素已经不能表示这些细节。一些Perlin噪音函数的实现可以根据屏幕限制,自动调节octave函数的数量。另外,当幅度太小时,也要停止增加octave函数。
下面我们看一个简单的噪音函数(一个随机数产生器)的代码,它返回浮点数[-1,1]
function Noise1(integer x, integer y) n = x + y * 57 n = (n<<13) ^ n; return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); end function function SmoothNoise_1(float x, float y) corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16 sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8 center = Noise(x, y) / 4 return corners + sides + center end function function InterpolatedNoise_1(float x, float y) integer_X = int(x) fractional_X = x - integer_X integer_Y = int(y) fractional_Y = y - integer_Y v1 = SmoothedNoise1(integer_X, integer_Y) v2 = SmoothedNoise1(integer_X + 1, integer_Y) v3 = SmoothedNoise1(integer_X, integer_Y + 1) v4 = SmoothedNoise1(integer_X + 1, integer_Y + 1) i1 = Interpolate(v1 , v2 , fractional_X) i2 = Interpolate(v3 , v4 , fractional_X) return Interpolate(i1 , i2 , fractional_Y) end function function PerlinNoise_2D(float x, float y) total = 0 p = persistence n = Number_Of_Octaves - 1 loop i from 0 to n frequency = 2i amplitude = pi total = total + InterpolatedNoisei(x * frequency, y * frequency) * amplitude end of i loop return total end function
perlin噪声函数相关推荐
- GPU Gems1 - 5 改良的Perlin噪声的实现
Perlin 噪声 KenPerlin(1985a,2002)KenPerlin(1985a,2002) 定义的噪声函数是最常用的噪声函数,称为 Perlin 噪声.PerlinPerlin 噪声在全 ...
- 实时体积云渲染(地平线):二.Perlin噪声和Worley噪声
实时体积云渲染(地平线):二.Perlin噪声和Worley噪声 Perlin噪声 Perlin噪声同样是网格点噪声的一种,不同于之间在网格点生成随机值的白噪声,Perlin噪声在网格点生成一个随机的 ...
- 代码本色0章——Perlin噪声生成起伏地形
代码本色0章--Perlin噪声生成起伏地形 此博文依据代码本色第0章中的随机数与Perlin噪声运用写成,并观看了丹尼尔希夫曼关于perlin噪声的讲解,https://www.youtube.co ...
- 简单聊聊 Perlin 噪声(下篇)
程序开发中总会用到随机方法,一般的随机方法虽然通用,但是产生的随机数又因为过于"随机",不适合用来生成平滑连续的随机数据(譬如自然地形的高度),这个时候我们便需要使用特殊的随机方法 ...
- 《再学一周光线追踪》 学习 四 Perlin噪声
蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术 为了获得酷酷的固体纹理,大多数人使用某种形式的柏林噪音.这些是以他们的发明家肯·佩林命名的.Perlin纹理不会返回这样的白噪声: 相反,它返回类似 ...
- OpenGL使用Perlin噪声的腐蚀效果
OpenGL使用Perlin噪声的腐蚀效果 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include &q ...
- 应用噪声函数制作火焰特效
1.白噪声 gridCount = 5,生成的白噪声纹理是 5行5列的:类似 frac(5x)的结果. 白噪声源码: float WhiteNoise(int seed, int i, int j) ...
- matlab小波分析信号消除噪声函数,小波分析的语音信号噪声消除方法
基于小波分析的语音信号噪声消除方法 及MATLAB 实现 一. 实验内容 噪声污染是我们生产.生活中普遍存在的问题.在某些环境中,噪声的影响给人们的生活和工作带来了极大不便,尤其在语音信号处理中,噪声 ...
- BGRABitmap图像操作8:生成纹理,基本的Perlin噪声地图
每次打开程序都不一样的纹理: unit Unit1;{$mode objfpc}{$H+}interfaceusesClasses, SysUtils, FileUtil, Forms, Contro ...
最新文章
- python输出命令_Python输出各行命令详解
- 苏州人民很快能坐上无人驾驶巴士,技术来自这家前Waymo工程师创立的公司
- 一文教你如何高效使用 IDEA !
- java css是什么_Java 之 CSS
- 星星排序python_python中怎么实现星星排列
- 分治法的关键特征_经典算法思想2——分治(Divide-and-Conquer)
- 金蝶kis云,调用增删改查注意点
- Python网络爬虫与信息提取 - requests库入门
- 模拟https类型的get,post请求时,碰到证书不信任,无法正常获取返回内容的异常
- Proteus8超硬核安装教程,按不上我请你吃饭
- ios模拟器装ipa包_给iOS 模拟器“安装”app文件
- 【Java3D】Java3D的Demo
- php.ini在哪?找不到php.ini,已解决
- 去中心化身份 DID( Decentralized Identifiers)
- 微信公众号如何插入html,教你如何在微信公众号优雅的展示代码
- 从瀑布到敏捷——漫画解读软件开发模式变迁史
- 微信公众号发送小程序卡片_微信公众号群发文章支持添加小程序卡片
- HBase的Nonce实现分析
- Android 访问系统相册选中图片,并返回该图片的路径
- Clickhouse第一讲-CK概述
热门文章
- Deepin系统安装后相关设置与环境搭建
- vs能运行python吗_vs怎么运行python(vs能运行python吗)
- git拉取tag代码_10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践...
- pytorch 学习率代码_DL知识拾贝(Pytorch)(五):如何调整学习率
- linux 目录权限及归属,Linux中如何设置目录或文件的归属及权限
- php server vscode,如何使用code-server打造自己的云端VSCode?
- php mysql 一级分类_无限级分类 for PHP+Mysql
- 8位并行左移串行转换电路_74ls194串行数据到并行数据的转换
- 安卓第三阶段实训项目:基于网络乐库音乐播放器V1.0
- Vue学习笔记:使用CLI构建Vue项目