web-dev-qa-db-fra.com

Comment utiliser des maillages avec plus de 64k sommets dans Unity 2018.1

J'ai entendu dire qu'Unity prend désormais en charge le tampon d'index 32 bits. Mais quand j'essaie Unity 2018.1, je ne peux pas le faire fonctionner.

J'ai construit des maillages dans du code comme ceci:

    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>());

Mon shader dessine un motif arc-en-ciel en fonction de la valeur alpha de la couleur du sommet.

La grille 256 x 256 est OK, mais la grille 512 x 512 ne montre que 1/4 de sa surface et de nombreux triangles erronés.

enter image description here

enter image description here

11
landings

Les tampons de maillage sont de 16 bits par défaut. Voir Mesh-indexFormat :

Le tampon d'index peut être de 16 bits (prend en charge jusqu'à 65 535 sommets dans un maillage), ou de 32 bits (prend en charge jusqu'à 4 milliards de sommets). Le format d'index par défaut est 16 bits, car cela prend moins de mémoire et de bande passante.

Sans regarder de trop près le reste de votre code, je note que vous n'avez pas défini de tampon 32 bits. Essayer:

mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
14
Lece