I created a Perlin noise function by loosely following a java tutorial in C#. I then used Unity to visualize it (I don't think the issue is with unity, as their inbuilt func works perfectly)
The problem is that there are too many large dark spots. Here is a photo
This is how I would like it to look
As you can see, it looks as if the points are not blending well.
Here is my code for the noise:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PerlinNoise
{
public PerlinNoise()
{
}
public double GetPixel(double x, double y)
{
int xint = (int)Math.Floor(x) & 255;
int yint = (int)Math.Floor(y) & 255; //gets what cube the input coords are
int g1 = p[p[xint] + yint];
int g2 = p[p[xint + 1] + yint];
int g3 = p[p[xint] + yint + 1];
int g4 = p[p[xint + 1] + yint + 1]; //gets the gradient vector's vaule on the permutation table
double xdec = x - Math.Floor(x);
double ydec = y - Math.Floor(y); //gets the pixel inside the cube
double d1 = grad(g1, xdec, ydec);
double d2 = grad(g2, xdec - 1, ydec);
double d3 = grad(g3, xdec, ydec - 1);
double d4 = grad(g4, xdec - 1, ydec - 1);
double u = fade(xdec);
double v = fade(ydec);
double x1Inter = lerp(u, d1, d2);
double x2Inter = lerp(u, d3, d4);
double yInter = lerp(v, x1Inter, x2Inter);
return yInter;
}
private static double lerp(double amount, double left, double right)
{
return ((1 - amount) * left + amount * right);
}
private static double fade(double t)
{
return t * t * t * (t * (t * 6 - 15) + 10);
}
private static double grad(int hash, double x, double y)
{
switch (hash & 3)
{
case 0: return x + y;
case 1: return -x + y;
case 2: return x - y;
case 3: return -x - y;
default: return 0;
}
}
private static readonly int[] p = { 151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
};
}
Here is the unity texture code:
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices.ComTypes;
// Create a texture and fill it with Perlin noise.
// Try varying the xOrg, yOrg and scale values in the inspector
// while in Play mode to see the effect they have on the noise.
public class TextureApply : MonoBehaviour
{
// Width and height of the texture in pixels.
public int pixWidth;
public int pixHeight;
// The origin of the sampled area in the plane.
public float xOrg;
public float yOrg;
// The number of cycles of the basic noise pattern that are repeated
// over the width and height of the texture.
public float scale = 1.0F;
private Texture2D noiseTex;
private Color[] pix;
private Renderer rend;
void Start()
{
rend = GetComponent<Renderer>();
// Set up the texture and a Color array to hold pixels during processing.
noiseTex = new Texture2D(pixWidth, pixHeight);
pix = new Color[noiseTex.width * noiseTex.height];
rend.material.mainTexture = noiseTex;
CalcNoise();
}
void CalcNoise()
{
// For each pixel in the texture...
float y = 0.0F;
while (y < noiseTex.height)
{
float x = 0.0F;
while (x < noiseTex.width)
{
double xCoord = xOrg + x / noiseTex.width * scale;
double yCoord = yOrg + y / noiseTex.height * scale;
PerlinNoise perlin = new PerlinNoise();
double sample = perlin.GetPixel(xCoord, yCoord);
pix[(int)y * noiseTex.width + (int)x] = new Color((float)sample, (float)sample, (float)sample);
x++;
}
y++;
}
// Copy the pixel data to the texture and load it into the GPU.
noiseTex.SetPixels(pix);
noiseTex.Apply();
}
void OnValidate()
{
CalcNoise();
}
}
Above is just modified code from docs.unity3d.com
I think the issue might be with the permutation table, instead of doing some convoluted way of doubling the number of values, I just copied and pasted it.
EDIT: [This is a picture of what I'm getting when I change this to Simplex Noise][1] [1]: https://i.stack.imgur.com/jfxNr.png