- Home /
Question by
laucha54321 · Oct 22, 2020 at 03:45 PM ·
procedural meshprocedural generationprocedural-generationmesh renderermesh manipulation
Why do I get this weird mesh error when I have a mesh over 250 by 250?
I am trying to generate a mesh that is over 250 by 250, but for some reason it breaks and it does not work, it gets weird artifacts on the mesh. If try doing it the mesh for some reason stays rectangular though it should be a square because I only use square sizes so I am sure the error has to do with the rest of the mesh.
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UIElements;
public class MeshGenerator : MonoBehaviour
{ //Resolucion del terreno
public int xSize;
public int zSize;
float minTerrainHeight;
float maxTerrainHeight;
public int offsetX;
public int offsetZ;
//Modificador de aleatoriedad
public float RandomModifier;
//Color del terreno generado
Color[] TerrainColor;
//Mesh
Mesh mesh;
//Vertices y cordenadas de vertices
Vector3[] vertices;
int[] triangles;
//Color del terreno
public Gradient TerrainHeightColor;
void Start()
{
mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
CreateShape();
UpdateMesh();
Debug.Log("RandomModifier = " + RandomModifier);
}
void Update()
{
}
void CreateShape()
{
vertices = new Vector3[(xSize + 1) * (zSize + 1)];
//Generador de las cordenadas de cada vertice del triangulo
for(int i = 0,z = 0; z <= zSize; z++)
{
for(int x = 0; x <= xSize; x++)
{
int y = Mathf.RoundToInt(Mathf.PerlinNoise((x+ offsetX) * 0.009f + RandomModifier,(z+offsetZ)*0.009f + RandomModifier)*40f);
vertices[i] = new Vector3(x,y,z);
i++;
if (y > maxTerrainHeight)
maxTerrainHeight = y;
if (y < minTerrainHeight)
minTerrainHeight = y;
//Debug.Log("y = " + y);
}
}
triangles = new int[xSize * zSize * 6];
int vert = 0;
int tris = 0;
//Generador de vertices de los triangulos
for(int z = 0;z < zSize; z++)
{
for(int x = 0;x < xSize; x++)
{
triangles[tris + 0] = vert;
triangles[tris + 1] = vert + xSize +1;
triangles[tris + 2] = vert + 1;
triangles[tris + 3] = vert + 1;
triangles[tris + 4] = vert +xSize+ 1;
triangles[tris + 5] = vert + xSize + 2;
vert++;
tris += 6;
}
vert++;
}
TerrainColor = new Color[vertices.Length];
for(int i= 0,z = 0;z <= zSize;z++)
{
for(int x = 0; x <= xSize; x++)
{
float height = Mathf.InverseLerp(minTerrainHeight,maxTerrainHeight, vertices[i].y);
TerrainColor[i] = TerrainHeightColor.Evaluate(height);
i++;
}
}
Debug.Log("MAX:" + maxTerrainHeight);
Debug.Log("MIN:" + minTerrainHeight);
}
void UpdateMesh()
{
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
for (int i = 0, z = 0; z <= zSize; z++)
{
for (int x = 0; x <= xSize; x++)
{
float height = Mathf.InverseLerp(-1, 40, vertices[i].y);
TerrainColor[i] = TerrainHeightColor.Evaluate(height);
i++;
}
}
mesh.colors = TerrainColor;
}
private void OnDrawGizmos()
{ if (vertices == null) return;
for(int i = 0; i < vertices.Length; i++)
{
Gizmos.DrawSphere(vertices[i], .1f);
}
}
}
error-en-la-mesh.jpg
(228.4 kB)
Comment
Did you check that you are below the maximum amount of vertices in your mesh (see here)?
Yes that was the problem, I fixed it. Thank you.
Answer by Physi3 · Nov 23, 2021 at 04:28 PM
Hi Laucha,
The problem here is you have reached Unity's vertex limit of 65535.
250x250 (62500 vertices) is the largest square Unity can make without passing its limits.
You'll need to split your mesh into multiple objects.