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

为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin)

柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图)

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

 

柏林噪声是用来生成一些看似杂乱无章其实有些变换规律的图形(更加贴近自然),比如海水、地形、雾等

当然这里面的原理涉及分形几何等相关的知识

例如,2D柏林噪声可以生成

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

 

以及一些网上的总结:

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

 还有一些其他的图

 

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

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

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

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

是不是看起来自然多了

那么今天,我们就来学习一下这个令人激动的牛逼技术

 

 Chapter 4:Perlin Noise

柏林噪声有2个关键的特点:

第一,输入相同的3D点,总能返回相同的随机值

第二,简单快捷,使用一些hack的方法,达到快速近似的效果。

 

 关于随机数:

许多人在他们的程序中使用“随机数产生器”,以使得物体的运动行为更加自然,或者用来生成纹理。随机数产生器在一些情况下很有用,比如用在模拟自然物体的地方,如地形,海水等。

自然物体通常是分形的,有各种各样的层次细节,比如山的轮廓,通过高度区分就有高山(mountain,高度变化大)、山丘(hill,高度变化适中)、巨石(高度变化小) 、石头(高度变化很小)等。另外,比如草地、海浪、跑动的蚂蚁、摇晃的树枝、风、大理石的花纹等等,这些都呈现出了或大或小的细节变化。Perlin噪声函数通过噪声函数来模拟这些自然景观。

要构造一个Perlin函数,首先需要一个噪声函数和一个插值函数

我们第一步当然是构建一个Perlin的类

class Perlin { public: inline rtvar noise(const rtvec& p)const; inline static rtvar* randomvalue() { return _randomvalue; } inline static int* perm_x() { return _perm_x; } inline static int* perm_y() { return _perm_y; } inline static int* perm_z() { return _perm_z; } public: static rtvar* perlin_generate(); static int* perlin_generate_perm(); static void permute(int* p, int n);

private: static rtvar* _randomvalue; static int* _perm_x; static int* _perm_y; static int* _perm_z; };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygfjs.html