【NoisyHeart的炼成】Part5:Perlin噪声的HLSL实现

来源:互联网 发布:sql怎么导入数据 编辑:程序博客网 时间:2024/06/03 13:24

bug时时有,MS不例外。

HLSL自带的noise()出了点问题,迫使我自己实现一个,借此机会我也调整了一下,缔造一个适合自己的鲁棒noise()。

噪声在图像的作用非常重要,而且Perlin的思想非常简单,至于Perlin的说明,我是不会在这说明的(这里只会写其它地方找不到的内容)。

#define PI 3.141592653589793240float Perlin(int n) {  n = (n << 13) ^ n;  return 1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0;    }float CosineInterpolate (float a, float b, float x) {  float f = (1.0 - cos (x * PI)) * 0.5;  return  a * (1.0 - f) + b * f;}float SmoothedNoise(int v) {  return Perlin(v) / 2  +  Perlin(v-1) / 4  +  Perlin(v+1) / 4;}int FastFloor (float v) { return (int) (v < 0) ? v - 1 : v; }float InterpolatedNoise (float v) {  int i = FastFloor(v);  float v1 = SmoothedNoise (i);  float v2 = SmoothedNoise (i + 1);  return CosineInterpolate(v1, v2, v - i);}float PerlinNoise(float v){float total = 0;float amplitude = 1.0f;float frequency = 1.0f;for( int i = 0 ; i < 2; i++){total += InterpolatedNoise (v * frequency) * amplitude;    frequency *= 2.0f;    amplitude *= 0.666f;}return total;}
(注意:这也是HLSL代码)

0 0