手贱去点了图形学里面的噪声课程,然后一个周末就交代在这上面了,还是有些云里雾里。

噪声就是给定一个输入变量,生成一个值在0~1范围内的伪随机变量的函数。在图形学中一般是输入一个坐标得到一个范围在0~1之间的变量,在利用各种颜色计算得到一些比较酷炫的效果,像火焰、云彩、地形等。下面就是perlin噪声生成个灰度图。

没啥意思是吧,那么看下面这个:

现在说说最有名的噪声算法:perlin噪声又称柏林噪声,噪声鼻祖。柏林噪声是基于网格的,假想了一堆格网,每个格子由四个顶点组成(三维场景就是立方体,每个立方体由8个顶点组成);


图1:小蓝点代表输入值在单元正方形里的空间坐标,其他4个点则是单元正方形的各顶点

每个顶点有一个伪随机向量(就是一个向量,由一个伪随机函数生成的,伪随机函数可以随便找一个,perlin老爷子也是随便找了一个)。


图2:各顶点上的梯度向量随机选取结果

同时这四个顶点距离落在格网中的点,可以得到四个距离向量。


图3:各个距离向量

将图2得到的梯度向量与图3的距离向量做点乘,由于都是单位向量点乘积在0-1之间。同时这个点最终的值由四个点乘积根据权重关系做差值得到。

这个差值函数使用缓和曲线(ease curves)来计算它们的权重和。在原始的Perlin噪声实现中,缓和曲线是s(t)=3t2−2t3s(t)=3t2−2t3,在2002年的论文6中,Perlin改进为s(t)=6t5−15t4+10t3s(t)=6t5−15t4+10t3。(原文来自这篇文章

好了现在来看看第一个效果是怎么做出来的(至于第二个么,咳咳,等我完全看明白会写出来的)

这个效果是来自ShaderToy中的。

// 生成一个伪随机向量,这个函数是找的一个伪随机函数,可以用其他的伪随机函数代替
vec2 hash( vec2 x ) // replace this by something better
{
const vec2 k = vec2( 0.3183099, 0.3678794 );
x = x*k + k.yx;
// fract的作用是取小数,那么小数在0~1之间;乘以2再加-1,最终返回坐标范围在-1~1之间
return -1.0 + 2.0*fract( 16.0 * k*fract( x.x*x.y*(x.x+x.y)) );
} float noise( in vec2 p )
{
vec2 i = floor( p ); // 取一个格子
vec2 f = fract( p ); // 获取在格子内的位置 vec2 u = f*f*(3.0-2.0*f); // 根据权重的平滑函数 return mix(
mix( dot( hash( i + vec2(0.0,0.0) ), f - vec2(0.0,0.0) ),
dot( hash( i + vec2(1.0,0.0) ), f - vec2(1.0,0.0) ),
u.x), // 将水平方向得到的两个点乘积根据水平方向的权重做差值
mix( dot( hash( i + vec2(0.0,1.0) ), f - vec2(0.0,1.0) ),
dot( hash( i + vec2(1.0,1.0) ), f - vec2(1.0,1.0) ),
u.x),
u.y);// 在竖直方向上对两个值按权重进行差值
} // ----------------------------------------------- void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 p = fragCoord.xy / iResolution.xy; // 像素位置除以分辨率,坐标范围在0~1之间 vec2 uv = p*vec2(iResolution.x/iResolution.y,1.0); // 这时u.x范围在0~宽高比之间,u.y在0~1之间 float f = 0.0; // left: noise
if( p.x<0.6 )// 左边部分简单的生成单噪声
{
f = noise( 32.0*uv ); // 32作为一个参数音箱噪音频率
}
// right: fractal noise (4 octaves)
else // 右边部分使用四个倍频在模拟效果
{
uv *= 8.0;
mat2 m = mat2( 1.6, 1.2, -1.2, 1.6 );
f = 0.5000*noise( uv ); uv = m*uv;
f += 0.2500*noise( uv ); uv = m*uv;
f += 0.1250*noise( uv ); uv = m*uv;
f += 0.0625*noise( uv ); uv = m*uv;
} f = 0.5 + 0.5*f; f *= smoothstep( 0.0, 0.005, abs(p.x-0.6) ); // 生成中间那条黑线,smoothstep的作用看这里,https://blog.csdn.net/libing_zeng/article/details/68924521 fragColor = vec4( f * iTime, f, f, 1.0 );
}

最后还是列一下大神们的文章:

【图形学】谈谈噪声

一篇文章搞懂柏林噪声算法,附代码讲解

[数学][转载][柏林噪声]

 

perlin噪声的更多相关文章

  1. 小强学渲染之Unity Shader噪声应用

    之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...

  2. 【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise

     Preface 为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin) 柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图) 柏林噪声是用来生成一些看似杂乱 ...

  3. love2d--glsl03噪声

    由于一些glsl的教程都是3d的,而love是2d的,所以之后以示例为主,我会收集 一些love的shader,分类讲解. 此文简译自love2d社区博客,这里略去作者的自我介绍. 像素着色器入门 示 ...

  4. 利用噪声构建美妙的 CSS 图形

    在平时,我非常喜欢利用 CSS 去构建一些有意思的图形. 我们首先来看一个简单的例子.首先,假设我们实现一个 10x10 的格子: 此时,我们可以利用一些随机效果,优化这个图案.譬如,我们给它随机添加 ...

  5. U3D 收藏一个飞机随机运动的方法

    文章转载:http://www.manew.com/thread-43578-1-1.html 前面的学习中已经涉及到了随机运动,这一篇主要还是前面的随机运动的改进,不废话直接上效果图吧,对比前面的随 ...

  6. 分享一个大神自己的blog

    std::sort() 详解 http://feihu.me/blog/ C++11 新特性 http://blog.guoyb.com/2016/09/19/cpp11-all/ unity3d 相 ...

  7. 【Unity Shader】2D动态云彩

    写在前面 赶在年前写一篇文章.之前翻看2015年的SIGGRAPH Course(关于渲染的可以去selfshadow的博客里找到,很全)的时候看到了关于体积云的渲染.这个课程讲述了开发者为游戏< ...

  8. 【ShaderToy】水彩画

    写在前面 好久没有更新shadertoy系列了,我万万没想到有童鞋还惦记着它...之前说过希望可以一周更新一篇,现在看来是不怎么可能了,一个月更新一篇的希望比较大(不要再相信我了...) 我把之前实现 ...

  9. 代码本色 用编程模拟自然系统 (Daniel Shiffman 著)

    https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.7/p5.js http://www.box2d.org http://www.jbox2d.org ...

随机推荐

  1. 深夜学算法之SkipList:让链表飞

    1. 前言 上次写Python操作LevelDB时提到过,有机会要实现下SkipList.摘录下wiki介绍: 跳跃列表是一种随机化数据结构,基于并联的链表,其效率可比拟二叉查找树. 我们知道对于有序 ...

  2. mysql各种引擎对比、实战

    1)存储引擎概述: (2)MySQL各大存储引擎: (3)InnoDB和MyIsam使用及其原理对比: (4)InnoDB和MyIsam引擎原理: (5)剩余引擎的使用DEMO(主要是Mrg_Myis ...

  3. JFrame图形界面 ----绝对布局和按钮

    开始 绝对布局应该是最简单的一种布局方式了,只需要确定好大小和位置就可以固定不变 代码 ` package window; import java.awt.Color; import java.awt ...

  4. python函数注释, :与 ->

    python函数注释, :与 -> 如图:add1函数中的:意思是:函数中的参数说明    add2函数中:->意思是:函数的返回值为整型 这两种方法都是函数的注释方法,具体使用时要别人能 ...

  5. javascript 判断对象类型

    typeof typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不同的结果. 此表总结了typeof所有可能的返回值: 操作数类型 返回值 undefined &qu ...

  6. 电梯调度算法---SCAN算法

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 扫描(SCAN)调度算法:总是从磁臂当前位置开始,沿磁臂的移动方向去选择离当前磁臂最近的那个柱面的访问者.如果沿磁臂的方向无请求访问时,就改变磁 ...

  7. Android 打造编译时注解解析框架 这只是一个开始

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43452969 ,本文出自:[张鸿洋的博客] 1.概述 记得很久以前,写过几篇博客 ...

  8. 在Windows Server 2008 R2下搭建jsp环境(二)-JDK的下载安装

    因为服务器上的Tomcat的运行环境需要JDK的支持,所以,掌握JDK的安装与下载和配置是一个重要步骤.   1.首先下载最新的JDK版本.网络上提供了最新版本的JDK下载,如图所示.首先选择&quo ...

  9. Go缓存DNS

    Go里面的DNSclient没有带任何的缓存,语言层面没有任何的缓存,但是我们可以通过下面这样的代码来 这样当我们调用http.Client的时候就会采用这个缓存的ip了,里面用到的dnscache是 ...

  10. google cache源码详解

    一.引子 缓存有很多种解决方案,常见的是: 1.存储在内存中 : 内存缓存顾名思义直接存储在JVM内存中,JVM宕机那么内存丢失,读写速度快,但受内存大小的限制,且有丢失数据风险. 2.存储在磁盘中: ...