Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use meshes with more than 64k vertices in Unity 2018.1

I've heard that Unity supports 32-bit index buffer now. But when I try Unity 2018.1 I can't make it work.

I built meshes in code like this:

    int nVertices = nx * ny;
    Vector3[] vertices = new Vector3[nVertices];
    Color[] colors = new Color[nVertices];
    for(int i = 0; i < nx; i++) {
        float x = i * w / (nx - 1);
        for (int j = 0; j < ny; j++) {
            float y = j * h / (ny - 1);
            int vindex = i * ny + j;
            vertices[vindex] = new Vector3(x, y, 0);
            float colorx = Mathf.Sin(x) / 2 + 0.5f;
            float colory = Mathf.Cos(y) / 2 + 0.5f;
            colors[vindex] = new Color(0, 0, 0, colorx * colory);
        }
    }
    List<int> triangles = new List<int>();
    for (int i = 1; i < nx; i++) {
        for (int j = 1; j < ny; j++) {
            int vindex1 = (i - 1) * ny + (j - 1);
            int vindex2 = (i - 1) * ny + j;
            int vindex3 = i * ny + (j - 1);
            int vindex4 = i * ny + j;
            triangles.Add(vindex1);
            triangles.Add(vindex2);
            triangles.Add(vindex3);
            triangles.Add(vindex4);
            triangles.Add(vindex3);
            triangles.Add(vindex2);
        }
    }
    Mesh mesh = new Mesh();
    mesh.SetVertices(vertices.ToList<Vector3>());
    mesh.SetIndices(triangles.ToArray(), MeshTopology.Triangles, 0);
    mesh.SetColors(colors.ToList<Color>());

My shader draws rainbow pattern according to vertex color's alpha value.

256 x 256 grid is OK, but 512 x 512 grid only shows 1/4 of its area and many wrong triangles.

enter image description here

enter image description here

like image 971
landings Avatar asked May 20 '18 10:05

landings


People also ask

How many vertices can a mesh have Unity?

In Unity, the format of the mesh index buffer dictates the maximum number of vertices that each 3D object can use: A 16-bit index buffer supports up to 65,535 vertices.

How do you merge meshes in Unity?

You can only combine meshes as long as they use the exact same material. The easiest way to combine meshes in Unity which have the same material is to check the "static" checkbox so Unity can statically batch them into a single mesh. Of course this only works for objects which are static (do not move, rotate or scale).


1 Answers

Mesh buffers are 16 bit by default. See Mesh-indexFormat:

Index buffer can either be 16 bit (supports up to 65535 vertices in a mesh), or 32 bit (supports up to 4 billion vertices). Default index format is 16 bit, since that takes less memory and bandwidth.

Without looking too closely at the rest of your code, I do note that you've not set a 32 bit buffer. Try:

mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
like image 98
Lece Avatar answered Oct 05 '22 23:10

Lece