为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin)
柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图)
柏林噪声是用来生成一些看似杂乱无章其实有些变换规律的图形(更加贴近自然),比如海水、地形、雾等
当然这里面的原理涉及分形几何等相关的知识
例如,2D柏林噪声可以生成
以及一些网上的总结:
还有一些其他的图
是不是看起来自然多了
那么今天,我们就来学习一下这个令人激动的牛逼技术
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;
};