关于云纹理和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
posted @ 2009-10-02 13:40  ttthinks  阅读(2041)  评论(0编辑  收藏  举报