What would cause shadowy stripe artifacts on a mesh generated from perlin noise?

Hi everyone,

I’ve been working on procedurally generating a mesh, going by Sebastion Lague’s tutorial.

I managed to create the mesh by generating a perlin noise map with Mathf (yes, I know simplex is technically better), and used it as a basis for the heights of the vertices on the mesh:

public static MeshData GenerateTerrainMesh(float[,] heightMap, float heightMultiplier, AnimationCurve heightCurve)
    {
        int width = heightMap.GetLength(0);
        int height = heightMap.GetLength(1);

        float topLeftX = (width - 1) / -2.0f;
        float topLeftZ = (height - 1) / 2.0f;
        
        MeshData meshData = new MeshData(width, height);
        int vertexIndex = 0;

        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                meshData.vertices[vertexIndex] = new Vector3(topLeftX + x, heightCurve.Evaluate(heightMap[x, y]) * heightMultiplier, topLeftZ - y);
                meshData.uvs[vertexIndex] = new Vector2(x / (float)width, y / (float)height);

                if (x < width - 1 && y < height - 1)
                {
                    meshData.AddTriangle(vertexIndex, vertexIndex + width + 1, vertexIndex + 1);
                    meshData.AddTriangle(vertexIndex, vertexIndex + width, vertexIndex + width + 1);
                    
                }

                vertexIndex++;
            }
        }

        return meshData;
    }
}

public class MeshData
{
    public Vector3[] vertices;
    public int[] triangles;
    public Vector2[] uvs;

    public int triangleIndex;

    public MeshData(int meshWidth, int meshHeight)
    {
        vertices = new Vector3[meshWidth * meshHeight];
        uvs = new Vector2[meshWidth * meshHeight];
        triangles = new int[(meshWidth - 1) * (meshHeight - 1) * 6];
    }

    public void AddTriangle(int a, int b, int c)
    {
        triangles[triangleIndex] = a;
        triangles[triangleIndex + 1] = b;
        triangles[triangleIndex + 2] = c;
        triangleIndex += 3;
    }

    public Mesh CreateMesh()
    {
        Mesh mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uvs;
        mesh.RecalculateNormals();
        mesh.name = "Procedural Mesh";

        return mesh;
    }

The result was (mostly) satisfactory:
Image in Google Drive

As you can see in the image, there are strange shadow lines going across the mesh, and only where the mesh isn’t mostly flat (so only on steeper inclines). These dark lines trace along rows of vertices, and they’re evenly spaced every few rows. It’s not the material or texture-- it persists if I swap them out. It’s not the object casting shadows or having shadows casted on itself-- when I disabled its interactions with shadows, nothing changed. It doesn’t seem to be the shadow resolution in the quality settings. I wonder if it’s an artifact of the perlin noise, like periodic raised lines of vertices, but I’m new to this, and I have no idea whether I should expect something like that.

If someone else has more experience with this kind of thing, I’d really appreciate a hand.

Edit: I think this picture captures it even better :better example pic

Wow. Same problem here pls respond to that if u find a fix.
@WorldLink