噪音 - Perlin Noise

转载自:http://www.cnblogs.com/babyrender/archive/2008/10/27/BabyRender.html

说起perlin noise, 最初也就是在课上大概了解了一下, 知道是个生成仿真贴图的东西. 学的时候没怎么细想, 只是知道这个东西很快. 生成3d贴图很方便. 不过最近在做sampling的时候, 发现我的算法有个很大的内存问题, 在超过3d的空间里sampling需要太大的内存. 结果我敬爱的victor一语敲醒梦中人(抬抬一台一台台). "2d或者3d如果可行的话, 去做noise吧" ... 于是就去找了perlin从85年开始的文章一篇篇看了过来...(说实话, 真正的perlin noise 其实是在89年, 85年那篇个人认为更大的突破在于提出了shading language的思想...) 嗯.. 发现noise还是很有意思的 ... 而且最近在siggraph和eurographics都很火的样子...恩, 好吧, 不废话了, 大家乱起来~~~~

perocedural texture?

说起texture, 一般来说分成2种. 一种是在物体表面直接贴图片的. 优点很明显, 就是真实感非常的强, 能精确的表达想要的效果(比如墙上的画啊, 酒瓶上的标签之类的). 不过缺点也很明显. 就是内存需要量太大, 尤其是做3d贴图的时候. 一个128*128*128的单色贴图至少需要2^21个BYTE.  而实际上, 很多我们需要的贴图都不是需要跟某张图一一对应的. 举个例子, 比如我们想在一个平面上贴一张国际象棋棋盘的纹理. 我们没必要让这张纹理和某张国际象棋棋盘的图片一模一样, 而只是需要平面"看起来"覆盖了一张棋盘的纹理就好了. 比如下面这张图, 我们完全可以用几行代码加几个mod运算就可以生成. 这种方法被人称作procedural texture. 简单来说就是一个时间(运算)换空间(内存)的换算.

理论上说, 所有的texture都可以用procedural texture来模拟. 但事实上, 很多东西是很难模拟的, 比如说某人的照片, 这个恐怕很难找到一个合理的算法来生成. 但自然界的很多物体, 或者现象都是在混乱的基础上规律出现的. 比如说树的年轮, 我们可以说是很多个不规则的同心圆. 比如说水面, 我们可以说是很多个不同的sin函数的和, 等等. 而这些现象, 如果找到一个合理的函数, 在加上一些"合理的"随机值的话, 完全可以被模拟. 而perlin noise的目的就是来模拟这种现象.

coherent noise?

procedural texture的目的(其实是所有贴图的目的)是在给定一个坐标值的时候, 能返回一个相应的颜色值. 在2d空间里, 就相当于一个这样的函数

Color Texture(float x, float y);

 如果在这个函数里, 对于每一个x和y返回的颜色都是无关的, 比如, 只是返回一个随机的颜色值. 那我们就得到了一个非常杂乱的图像.:

显然, 这种图片还里现实中的物体表面相差很远. 原因就是我们没有考虑到 : 自然界中, 物体的表面都是相对平滑的, 物体表面距离很近的2个点, 颜色会比较相似, 而距离很远的2个点, 颜色相对没有任何关系.   这种相对关联的关系怎么表现呢? 一种流行的做法就是, 规定好一些关键点. 然后把这些关键点的颜色固定. 之后"平滑"的插入这些关键点之间的点. 

     

2d的图片可以表象的更好一点:

    

虽然我们依旧不能说右边这张贴图是个什么物体的表面, 但起码看起来要比左边那张看起来"自然"多了.左边那张只是些点的杂乱无章的排列, 叫做噪音(一般叫做白色噪音), 而右边那张被平滑过的, 就算做关联噪音coherent noise.

multi-octaves? 

如果你拿到很多个这种"平滑"过的噪音再把它们加起来的话, 呵呵, 会有很有意思的现象发生的. 比如下面这个1d的例子. 

  

其中每一个噪音的频率都是之前一个的2倍. 而每一个噪音的振幅都是之前一个的一半. 他们的和是这个样子的:

 

我们可以看到, 这个"和噪音" 像极了一个1d的山峰, 恩, 我要说,还真看起来蛮像那么回事的,其中, 频率比较低的噪音表现出了山峰的大概轮廓, 频率比较高的噪音表现了相对比较杂乱的细节. 恩.其实很多游戏里的山都是这么生成的. 而这个现象, 其实应用到了很多方面. 像fourier transform, wavelet transform之类的转换.在noise这个领域, 相加之前的每个噪音函数叫做octave, 这种把很多个频率是之前一个一般的octave加起来的技术叫做multi octaves. 应用这种技术, 可以仿真很多真实的纹理, perlin在他的网页里给出了一张图片. 实际上, 因为这张图片太经典了, 基本上, 只要是介绍perlin noise 的网页都会给出, 为了遵守行业潜规则, 我也不得不把它加上.

 

 perlin noise?

就像前面我说的, 生成perlin noise , 要分3步走:

 

  • 固定一部分点的颜色

     

 

 

  •  "平滑"这些固定点中间的颜色

     

  • 用上面的方法生成几个不同频率的平滑噪音, 然后相加,.

     

为了保证生成噪音的频率, 一般是通过改变固定点的数量. 固定点多的, 噪音自然相对比较杂乱(因为2个点之间的间隔比较小, 整体上来看, 平滑的程度自然不高), 也就是说, 噪音的频率比较高. 相对的, 固定点少的, 噪音的频率就比较低. 基于这个原因, 对于每个噪音, 我们固定4倍于之前噪音的点就可以保证频率是之前噪音的2倍(2d环境下).

说到现在, 你可能觉得perlin noise也不过如此. 也不算什么太革新的东西. 但实际上, 我们还有一个很大的问题没有解决, 就是那个"平滑". 怎么平滑? 用什么函数来平滑? 线性的? polynomial的? gaussian的? 复杂的函数肯定会带来更好的结果, 但运算时间呢? 要知道, cpu或者gpu可不能浪费大把的时间来处理一个小小的texture, 还有大把更重要的工作要做. 

于是乎, perlin noise 的核心思想出现了. 叫做gradient noise . (其实在很多文献里, 人们把perlin noise 叫做gradient noise). 

gradient noise?

首先要说的是,   固定一部分点的颜色值, 然后"平滑"这些颜色绝对是一个笨办法(其实叫做value noise. 可能在其他方面有他的应用. 但在texture方面绝对不可行.).因为为了到达很好的连续度 要用到很高阶的过滤函数. 恩, 换种说法. 为了达到很好的连续度, 用于"平滑"的函数要很复杂才行. perlin在89年提出了一种更有效的"平滑"方法. 就是给每个固定点固定一个gradient(中文不知道该怎么说, 应该是叫坡度吧.), 然后在中间的点"平滑"这些坡度. 这样, 哪怕是使用线性函数, 也能保证达到C1的平滑度(具体定义比较麻烦, 其实C1是指两条曲线在接触点的微分值相等, 简单的说, 就是Cn中n越大, 连续度越好, 一般C2在人眼看来就已经很平滑了. 具体定义还是参看相关文献). 于是乎, 对于生成perlin noise 的那三步, 现在变成了: 

  • 固定一部分点的gradient

     

 

 

  •  "平滑"这些固定点中间的gradient

     

  • 用上面的方法生成几个不同频率的平滑噪音, 然后相加,.

     

而对于"平滑"函数, perlin用了一个hermite曲线 : w(t)=3t² - 2t³  (hermite嘛... 反正就是一个曲线啦....) .因为这个曲线保证了w(0)=0, w(1)=1. (换句话说, 保证了能在固定点取固定值, 而在非固定点取一个平滑的值.) 而且保证了w'(0) = 0和w'(1)=0, 也就是说保证了C2的连续度. (在02年, perlin推荐了一个更高阶的曲线, 保证了w''=0, 能够保证更好的连续度). 下面这张图是w曲线的1d表示

结束了? 还没有... 还有个内存上的小问题...

. 如果说我们的最终texture只是由一些低频的噪音生成的. 那么当用户把镜头拉的离物体很近的时候, 会像普通贴图一样产生一块一块的现象(回忆一下 Doom 撞墙的时候). 所以高频率的噪音绝对是有必要的. 而为了储存固定点的gradient, 要建立一个数组才行. 而当噪音的频率非常高的时候, 由于需要的固定点会很多, 这个数组也会非常的大. 为了降低内存的使用, perlin使用了1个256个元素的哈希表. 也就是说, 预先找出合理的, 足够随机的256个gradient, 存在一个表里. 然后每次需要某个固定点的gradient值的时候, 通过这个这个点的坐标, 伪随机的在表里选出一个值. 对于3d的情况, 如果我们想要坐标(i,j,k)的gradient g(i,j,k),而P里预存储了256个gradient, 那么:

g(ijk) = P[ ( i + P[ (j + P[k]) mod 256 ] ) mod 256 ]

 这样, 在生成perlin noise的时候, 内存的使用限定在了1个256大小的哈希表. 在02年, perlin进一步缩小了这个哈希表的大小到16. 

想想还有什么要说的...

作为对比, 下面第2张图使用了perlin noise 来达到"旧"的效果,是不是看起来更真实了?

 

perlin noise 的应用那是相当的广泛. texture, terrain, bump map, 云动画, 烟雾(ray marching)... 可以用在几乎所有那些"杂乱而有规律"的现象上. 

    

尤其是对材质的模拟, 可以说是出神入化. 原因就是perlin noise 快, 简单, 而且只占用很少的内存. 当然, 他的缺点也一样明显. 就是他的fourier spectrum不够band limited. 由于要阐述到fourier domain里的东西, 和其他类型的noise , 像 blue noise 的定义, 有机会再写吧. 值得一提的是, 这两年有不少人在研究完善perlin noise 和开发其他具有blue noise性质的其他技术. 比较成功的有wavelet noise (siggraph 2005) 和anisotropic noise(siggraph 2008). 有兴趣的朋友欢迎一起讨论.

转载于:https://www.cnblogs.com/zengqh/archive/2012/10/17/2727421.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《画解算法》2.整数反转【python-简单】

🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌。简历模板、职场PPT模板、技术难题交流、面试套路尽管【关注】私聊我。 🍅 欢迎点赞 👍 收藏 ⭐留言 📝…

360:中国为什么没有自主研发的浏览器内核?

来源:360公司物联网智库 整理发布摘要:近日360公司发表题为《中国为什么没有自主研发的浏览器内核?》的文章,文章中写道:从0到1,从无到有,这是很多人理解的自主研发,按这个标准&…

❤️ 炒 股 实 战丨原 地 起 飞 ❤️

郑重声明: 1、个人版可以免费获取交易数据进行分析,企业级大规模调用数据需要购买积分(大家玩玩即可) 2、为避免广告代言,本文将不会出现任何logo、链接和包,需要玩的主页私聊我! &#x1f345…

人工智能研究的新前线:生成式对抗网络

林懿伦, 戴星原, 李力, 王晓, 王飞跃来源:科学网 摘要:生成式对抗网络(Generative adversarial networks, GAN)是当前人工智能学界最为重要的研究热点之一。其突出的生成能力不仅可用于生成各类图像和自然语言数据,还启…

中国自动化学会平行智能专业委员会成立

摘要:2018年8月18日上午,中国自动化学会平行智能专业委员会成立大会在中国科学院自动化研究所报告厅隆重举行。2018年8月18日上午,中国自动化学会平行智能专业委员会成立大会在中国科学院自动化研究所报告厅隆重举行。中国科学院院士吴宏鑫教…

2008-2018,5个版本互联网大脑模型的演进与对比

2018年8月,我们绘制的第五个版本的互联网大脑模型图,新的版本相当于为互联网找到了左右大脑的机制-机器智能左大脑和群体智能右大脑。第五版的绘制距离2008年第一个版本正好10年。互联网大脑模型主要是针对1969年以来互联网的网状模型,在21世…

2.安装MySQL

2.安装MySQL Mac系统中安装MySQL 使⽤用Mac中的Homebrew进⾏行行mysql的安装 1.下载安装mysql brew install mysql5.7 如果看到以下界⾯面则表示已经下载安装成功 2.启动mysql mysql.server start 3.关闭mysql mysql.server stop 4.登录mysql mysql -u root -p Windows安…

CNNIC互联网报告:中国网民超8亿 前沿科技进展显著

来源:新浪摘要:8月20日下午消息,中国互联网络信息中心(CNNIC)在京发布第42次《中国互联网络发展状况统计报告》。根据报告,截至2018年6月30日,我国网民规模达8.02亿,普及率为57.7%;手机网民规模达7.88亿&am…

4.MySQL基础操作

4.MySQL基础操作 使用方法: 方式一: 通过在命令行敲命令来操作 ( 有助于命令的掌握)方式二: 通过图型界面工具,如 Navicat 等(在熟练掌握后再使用)方式三:通过编程语言(python,php,java,go...)执行mysql命令 SQL ( Structure query language ) 结构化查询语言 SQL语言分为4个…

19个人工智能(AI)热门应用领域,你知道多少?

来源:网络大数据摘要:自然语言生成是人工智能的分支,研究如何将数据转化为文本,用于客户服务、报告生成以及市场概述。01自然语言生成(Natural Language Generation)自然语言生成是人工智能的分支,研究如何将数据转化为…

滴滴重磅发布:KDD2018大会187页人工智能+交通教程

来源:专知摘要:随着深度学习技术的提升,智能交通领域吸引了越来越多研究人员的关注,今天为大家带来滴滴在KDD大会上的最新教程,为大家呈现智能交通领域的最新进展。摘要随着网上约车与自动驾驶技术的快速发展&#xff…

5.一文搞懂MySQL的数据类型

🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌简历模板、PPT模板、技术资料尽管【关注】私聊我。 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 历史文章目录&#…

中国机器人产业发展报告(2018)正式发布!

来源:机器人创新生态摘要:2018年8月16日,《中国机器人产业发展报告(2018)》于2018世界机器人大会主论坛上正式发布,该报告为工信部2016-2018年专项《建立我国机器人团体标准体系与产业信息资源库》的阶段性…

❤️ 给你的Linux把把脉(内存、磁盘、CPU、网络)❤️

🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌。简历模板、职场PPT模板、技术难题交流、面试套路尽管【关注】私聊我。 今日重点: ① 学会查看linux各种状态,包括&a…

团结就是力量,TeamCola浅谈创业团队腾云驾雾的归国征程

记得网上曾流传过这样一句话:“不怕神一样的对手,就怕猪一样的队友”,相信看过的人都会心一笑,明白与优秀的搭档默契地合作有多重要。“你需要信任你伙伴的能力和责任心,而信任的基础则是开放和透明——在一个扁平而高…

知识图谱的前世今生:为什么我们需要知识图谱?

来源:SimmerChan(知乎)编辑:Debra摘要:本文主要分为三个部分。第一个部分介绍我们为什么需要知识图谱,第二个部分介绍知识图谱的相关概念及其形式化表示。最后,作一个简单的总结,并介…

7.Mysql数据库表引擎与字符集

7.Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送 一段文本(MySQL语句),服务器进程处理后再向客户端进…

大数据+人工智能正以八种方式撼动商界

来源: 数据观摘要:如果你想帮助你的企业实现更多,那么拥抱大数据和人工智能就很有必要了。事实上,那些没能接受这些新兴技术的企业,用不了多久就会逐渐消失在时代发展的长河中。大数据、人工智能正成为技术界的热点&am…

android 自定义 radiobutton 文字颜色随选中状态而改变

from:http://blog.csdn.net/hpccn/article/details/7591662先看效果主要是写一个 color selector 在res/建一个文件夹取名color res/color/color_radiobutton.xml [html] view plaincopy <?xml version"1.0" encoding"utf-8"?> <selector xml…

Gartner2018新技术成熟度曲线:五大技术趋势成为新热点

来源&#xff1a;网络大数据近日&#xff0c;Gartner发布了2018年新技术成熟度曲线&#xff0c;首次将Biohacking(生物黑客)列为热点技术趋势&#xff0c;再次引发市场关注。Gartner技术成熟度曲线又称技术循环曲线、光环曲线或者技术炒作周期。是方便企业和CIO们评估新技术成熟…