I have a mesh generation script that produces meshes that look like this:

The problem is when I render them they turn out like this:
I know I need to generative normals and UV coords for it, but I have no idea how to do that. All I want is for the object to have a solid color and for shadows/lighting to work correctly.
This is what my mesh generation code looks like:
public void RenderMesh(List<Vector3> positions, int maxIterations, int layerResolution)
{
var triangles = new List<int>();
var meshFilter = gameObject.GetComponent<MeshFilter>();
var meshCollider = gameObject.GetComponent<MeshCollider>();
Mesh mesh = new Mesh();
meshFilter.mesh = mesh;
for (int level = 1; level <= maxIterations; level++)
{
if (level < maxIterations)
{
for (int circlePoint = 0; circlePoint < layerResolution; circlePoint++)
{
var index = level * layerResolution + circlePoint;
if (circlePoint < layerResolution - 1)
{
triangles.Add(index);
triangles.Add(index - layerResolution + 1);
triangles.Add(index - layerResolution);
triangles.Add(index);
triangles.Add(index + 1);
triangles.Add(index - layerResolution + 1);
triangles.Add(index - layerResolution);
triangles.Add(index - layerResolution + 1);
triangles.Add(index);
triangles.Add(index - layerResolution + 1);
triangles.Add(index + 1);
triangles.Add(index);
}
else
{
triangles.Add(index);
triangles.Add(index - 2 * layerResolution + 1);
triangles.Add(index - layerResolution);
triangles.Add(index - layerResolution + 1);
triangles.Add(index - 2 * layerResolution + 1);
triangles.Add(index);
triangles.Add(index - layerResolution);
triangles.Add(index - 2 * layerResolution + 1);
triangles.Add(index);
triangles.Add(index);
triangles.Add(index - 2 * layerResolution + 1);
triangles.Add(index - layerResolution + 1);
}
}
}
else
{
var lastPointIndex = positions.Count - 1;
for (int circlePoint = 0; circlePoint < layerResolution; circlePoint++)
{
var index = (maxIterations - 1) * layerResolution + circlePoint;
if (circlePoint < layerResolution - 1)
{
triangles.Add(index);
triangles.Add(index + 1);
triangles.Add(lastPointIndex);
triangles.Add(index);
triangles.Add(lastPointIndex);
triangles.Add(index + 1);
}
else
{
triangles.Add(index);
triangles.Add(index - layerResolution + 1);
triangles.Add(lastPointIndex);
triangles.Add(index);
triangles.Add(lastPointIndex);
triangles.Add(index - layerResolution + 1);
}
}
}
}
mesh.vertices = positions.ToArray();
mesh.triangles = triangles.ToArray();
mesh.RecalculateTangents();
mesh.RecalculateNormals();
Vector2[] uv = new Vector2[positions.Count];
for (int i = 0; i < uv.Length; i++)
{
uv[i] = new Vector2(positions[i].x, positions[i].y);
}
mesh.uv = uv;
meshCollider.sharedMesh = mesh;
}
