- Home /
Procedural Heightmap Jagged
I'm trying to create a procedural heightmap using LibNoise for Unity. It works brilliantly for creating images and textures, however when I apply the heightmap to a Terrain I get something like this:
I'm not entirely sure why this is, but it doesn't seem to be to do with the texture since it displays at full resolution when I apply the texture to a Plane.
When using TerrainToolkit, however, the terrain appears smooth, meaning that it also shouldn't be a problem with the terrain settings.
My code for heightmap generation and allocation is as follows:
 public void GenerateTerrainMountains () {
         RidgedMultifractal mountainTerrain = new RidgedMultifractal();
         mountainTerrain.Seed = (int) System.DateTime.Now.Ticks;
         mountainTerrain.OctaveCount = 4;
         mountainTerrain.Frequency = 1;
         mountainTerrain.Quality = QualityMode.High;
 
         ModuleBase mountainModule = mountainTerrain;
 
         TerrainData terrainData = terrain.terrainData;
 
         float[,] heightMapData = terrainData.GetHeights (0, 0, terrainData.heightmapWidth, terrainData.heightmapHeight);
 
         heightMap = new Noise2D (terrainData.heightmapWidth, terrainData.heightmapHeight, mountainModule);
         heightMap.GeneratePlanar (0, 1, 0, 1);
         Texture2D heightMapTexture = heightMap.GetTexture ();
         heightMapTexture.Apply ();
 
         previewPlane.renderer.material.mainTexture = heightMapTexture;
 
         Color[] colours = heightMapTexture.GetPixels ();
 
         // Read all detail layers into a 3D int array
         int index = 0;
         for (int heightX = 0; heightX < terrainData.heightmapWidth; heightX ++) {
             for (int heightY = 0; heightY < terrainData.heightmapHeight; heightY ++) {
                 float heightMapOffset = colours [index].grayscale;
                 heightMapData [heightX, heightY] = heightMapOffset;
                 index ++;
             }
         }
         
         // Write all detail data to terrain data
         terrainData.SetHeights (0, 0, heightMapData);
     }
If you need any more information I will be glad to provide it. Thanks in advance :)
I know this was asked a while ago, but did you ever figure it out? I'm having the same problem right now. :(
Answer by SkyDwarfProductions · Nov 06, 2018 at 11:57 AM
Hey @AngryPanther ! I have found a solution for you. The problem you are having is because you are assigning the verts height value off a texture. The jagged terrain effect you have has happened because your height map is a lower resolution then your actual mesh.
The height map texture uses pixels as I'm sure you know the pixels have a flat value so when more than one vert gets applied to the same pixel they will have the same value creating the jagged effect or I guess low resolution effect.
The solution I found is rather to use a 2D float array and assign the heights that way. You can do this my using the heightmap.GetData function instead of get texture.
Getting the heightmap data into a 2D float array would look something like this:
void GetTexture () { // DataH looks like this -----> float[,] DataH; .Its a 2D float array DataH = heightmap.GetData( false , 0 , 0, false); // <------- 2D FLOAT ARRAY solution by getting the data strait and not through a texture texture = heightmap.GetTexture (GradientPresets.Grayscale); // <------ TEXTURE solution that creates some problems }
Applying it to your mesh would look something like this:
for (int x = 0;x <= grid_size ;x+= Lod_Factor) { for (int y = 0;y <= grid_size ;y+= Lod_Factor) { //Hieghts[v] = texture.GetPixel (x, y).grayscale; <--- problematic at high frequancy Hieghts[v] = DataH [x,y]; // <--- preferd option verts [v] = new Vector3 ((x * quad_size) - middle , Hieghts [v] , (y * quad_size) - middle); UVS [v] = new Vector2 ((x * quad_size) - middle, (y * quad_size) - middle); v++; } } I know this is probably a little late but I hope it helps. 
Your answer
 
 
             Follow this Question
Related Questions
Procedural terrain bigger than I set it, heightmap slightly off 0 Answers
How to seamlessly tile terrains 0 Answers
Basics of procedural map generation 0 Answers
Merging, Transitioning, or Blending from one texture to the other based upon Height Maps 0 Answers
For loop not starting from zero 0 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                