关于云纹理和Perlin Noise

本文介绍如何使用Perlin Noise算法生成平滑随机数及云纹理。Perlin Noise通过控制频率与振幅来实现不同尺度的细节,适用于游戏开发中的自然景观模拟。
前几天看到一本《DirectX特效开发》的书,翻了几页发现了关于一些Perlin Noise和云纹理的生成。自己做了一下,搞到现在终于弄出个比较像Perlin Noise的噪音图。
  Perlin Noise主要目标是生成一个比较平滑的随机数,如果是纹理图,那么U,V方向的各个纹素应该较为平滑,不能太过剧烈的变化。
   频率:波长的倒数,这里是指距上一次随机点多远取一个随机数。也就是两个随机数之间的宽度的倒数。频率越高说明波长越短,也就有更多的锯齿。
   振幅:波的高度,这里也就是随机数产生的范围,振幅越大,范围越大。
  
   实质:首先我们要一个大体轮廓,然后轮廓是大体平滑的有些凸起的地方(振幅大,频率低),然后在其中平滑的地方再次添加轮廓(振幅比上次小,频率比上次高,添加细节),然后再继续,当然可以无限划分,不过我们一般使用在10次以内。这就是所谓的 分形,比如一座山,远远望去你可以看到轮廓,走近点,还有凹凸,如果有显微镜,还可以看到更小的尺寸也是不平整的,柏林噪音就模拟了这些东西,也包括云。
inline  float  Noise2D( int  x,  int  y)
{
    
int  n  =  x + y * 57 ;
    n 
=  (n << 13 ) ^ n;
    
return  ( 1.0f   -  ((n * (n * (n * n * 15731 + 789221 ) + 1376312589 ) & 0x7fffffff ) / 1073741824.0f ));
}
这是一个随机数种子,产生[-1,+1]范围内的随机数,对应于颜色为[0,255]
对于我们的纹理,振幅大也就相当于0~255,不过当然要稍微设置得小一点。那么频率呢,假设第一张纹理图为16X16.那么相当于U方向取样16个随机点,对于32X32那么相当于U方向取样32个随机点,因此,频率增大了一倍。当然,频率大的只是为了增加更小尺寸的细节轮廓,因此增幅就不能超过16x16的范围了,一般为前者的0.5倍。这就是通常所说的“ 倍频层”,依次类推。至于随机点的插值运算,我们就直接交给显卡了,使用纹理的双线性插值法。当然,频率越高需要插值的次数越少,极端一点,频率无限大那么就是连续函数了。而频率越大则纹理的尺寸越大32x32 映射到512X512的屏幕上自然要比16x16插值的次数少。
      将每张纹理渲染到使用线性插值渲染到RenderTarget后,再将RenderTarge的纹理进行复合再渲染就行了。




代码: /Files/ttthink/Noise.rar

转载于:https://www.cnblogs.com/ttthink/archive/2009/10/02/1577367.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值