public static float Sum(NoiseMethod method, Vector3 point, PerlinNoiseSettings settings) { var frequency = settings.frequency; float sum = method(point, frequency); float amplitude = 1f; float range = 1f; for (int o = 1; o < settings.octaves; o++) { frequency *= settings.lacunarity; amplitude *= settings.persistence; range += amplitude; sum += method(point, frequency) * amplitude; } return(sum / range); }
public static Texture2D PerlinNoise(int resolution, PerlinNoiseSettings settings) { var texture = new Texture2D(resolution, resolution, TextureFormat.RFloat, false, true); texture.name = "Perlin Noise Texture"; texture.wrapMode = TextureWrapMode.Clamp; texture.filterMode = FilterMode.Trilinear; texture.anisoLevel = 9; var method = NoiseHelper.noiseMethods[(int)NoiseMethodType.Perlin][2]; var point00 = new Vector3(0, 0); var point10 = new Vector3(1f, 0); var point01 = new Vector3(0, 1f); var point11 = new Vector3(1f, 1f); var stepSize = 1f / resolution; for (var y = 0; y < resolution; y++) { var point0 = Vector3.Lerp(point00, point01, (y + 0.5f) * stepSize); var point1 = Vector3.Lerp(point10, point11, (y + 0.5f) * stepSize); for (var x = 0; x < resolution; x++) { var point = Vector3.Lerp(point0, point1, (x + 0.5f) * stepSize); var sample = NoiseHelper.Sum(method, point, settings); sample = sample * 0.5f + 0.5f; texture.SetPixel(x, y, new Color(sample, sample, sample)); } } texture.Apply(); return(texture); }