I know this might be a bit of a noob question, but I can't figure out what I'm doing wrong, and the math that I have done should make this work correctly. I am trying to make a perlin noise map that is normal until a specific range, at which point it would decrease to where all the values trend towards zero, creating an island in an ocean. I am currently generating perlin "sample" values, and then dividing them by a factor which stays close to one up to a specific bound, and then increases polynomialy. The problem however, is that the noise stays stuck in the top right corner, and is darker than I would expect. Here is the mathematical function I am using graphed on Desmos where n is the boundary and x is the distance from the center of the map:
And here is the main body code I am using to generate the noise map:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GenNoise : MonoBehaviour {
public int width = 256;
public int height = 256;
public float scale = 20f;
public float offsetX;
public float offsetY;
public float falloffRange = 100;
public float falloffPower = 10;
public void RenderNoiseMap()
{
Renderer renderer = GetComponent<Renderer>();
renderer.sharedMaterial.mainTexture = GenerateTexture();
}
Texture2D GenerateTexture () {
Texture2D texture = new Texture2D(width, height);
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
Color color = GenerateColor(x, y);
texture.SetPixel(x, y, color);
}
}
texture.Apply();
return texture;
}
Color GenerateColor(int x, int y)
{
float xCoord = ((float)x / width * scale) + offsetX;
float yCoord = ((float)y / height * scale) + offsetY;
float falloffFactor = FalloffFactor(x, y, width, height);
float sample = Mathf.PerlinNoise(xCoord, yCoord);
sample = sample / falloffFactor;
return new Color(sample, sample, sample);
}
float FalloffFactor(int x, int y, int width, int height)
{
float falloffFactor = 1;
float centerX = (float)width / 2;
float centerY = (float)height / 2;
float distanceFromCenter = Mathf.Sqrt(Mathf.Pow(2, ((float)x - centerX)) + Mathf.Pow(2, ((float)y - centerY)));
falloffFactor = Mathf.Pow(2, (Mathf.Pow(falloffPower, (distanceFromCenter / falloffRange)) + 1));
return falloffFactor;
}
}
And Here is the code that I am using to generate the image in the editor:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(GenNoise))]
public class NewBehaviourScript : Editor {
public override void OnInspectorGUI()
{
DrawDefaultInspector();
GenNoise script = (GenNoise)target;
if (GUILayout.Button("Generate"))
{
script.RenderNoiseMap();
}
}
}