Unity: десериализация меша создает неполный меш? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь десериализовать сетку, и в результате получается беспорядочный беспорядок в треугольниках с пропуском большого количества данных.Процесс идет прямо, я получаю байтовый массив и читаю позиции, нормали, цвета и устанавливаю индексы.Точно такой же байтовый массив в программе на c ++ прекрасно воспроизводится, но когда он достигает единицы, это не так.Я проверил значения первых 500 элементов всех буферов на мертвое совпадение, поэтому я не думаю, что это десериализатор, а скорее какая-то деталь из Unity, которую мне не хватает.

Размеры буфера:

+-------+----------------------+----------------------+-----------------------+-------------+
| MapID | LENGTH(VertexBuffer) | LENGTH(ColorsBuffer) | LENGTH(NormalsBuffer) | VertexCount |
+-------+----------------------+----------------------+-----------------------+-------------+
|     2 |              3252744 |               813186 |               3252744 |      271062 |
+-------+----------------------+----------------------+-----------------------+-------------+

Код десериализатора сетки:

      byte[] results = www.downloadHandler.data;
        if( results.Length > 4 )
        {
            Debug.Log("MeshData length = " + results.Length );

            //First 4 bytes are a packed 32 bit uint of vertex count
            BinaryReader meshBuffer = new BinaryReader(new MemoryStream(results));
            int numVertices = meshBuffer.ReadInt32();
            Debug.Log("Number of Vertices: " + numVertices );

            if( numVertices > 0 )
            {
                //Create new MeshObject
                GameObject newMesh = new GameObject("Mesh");
                newMesh.AddComponent<MeshFilter>();
                newMesh.AddComponent<MeshRenderer>();

                //Create mesh
                Mesh downloadedMesh = new Mesh();
                Vector3 [] positions = new Vector3[numVertices];
                Color [] colors = new Color[numVertices];
                Vector3 [] normals = new Vector3[numVertices];
                int [] indices = new int[numVertices];

                //Vertex Positions
                for( int i = 0; i<numVertices; i++ )
                {
                    positions[i].x = meshBuffer.ReadSingle();
                    positions[i].y = meshBuffer.ReadSingle();
                    positions[i].z = meshBuffer.ReadSingle();
                    indices[i] = i;
                }

                //Vertex Colors
                for( int i = 0; i<numVertices; i++ )
                {
                    colors[i].r =  (float)(meshBuffer.ReadByte()/255f);
                    colors[i].g =  (float)(meshBuffer.ReadByte()/255f);
                    colors[i].b =  (float)(meshBuffer.ReadByte()/255f);
                    colors[i].a = 1;
                }

                //Vertex Normals
                for( int i = 0; i<numVertices; i++ )
                {
                    normals[i].x = meshBuffer.ReadSingle();
                    normals[i].y = meshBuffer.ReadSingle();
                    normals[i].z = meshBuffer.ReadSingle();
                }

                downloadedMesh.vertices = positions;
                downloadedMesh.normals = normals;
                downloadedMesh.colors = colors;
                downloadedMesh.triangles = indices;

                newMesh.GetComponent<MeshRenderer>().material = VertexColoringMaterial;
                newMesh.GetComponent<MeshFilter>().mesh = downloadedMesh;

                //Attach to scene graph
                newMesh.transform.parent = GameObject.Find("3DRoot").transform;
            }
        }

Выход:

Длина MeshData = 7318678 Количество вершин: 271062

PositionBufferSize = 271062 * 3 [x, y, z] * sizeof (float) == 3252744

ColorBufferSize = 271062 * 3 [r, g, b] * sizeof (ubyte) == 813186

NormalBufferSize = 271062 * 3 [x, y, z] * sizeof (float) == 3252744

Сумма: 7318674 + 4 байта для вершины Count = 7318678

Мой C ++ Render: enter image description here

Render Unity: enter image description here

Как примечание, в OpenGL я могу передать цвета, нормали и вершины без необходимости индексации через атрибуты вершин.Есть ли в Unity аналог, чтобы мне не нужно было взрывать оперативную память, создавая ненужный индексный массив int [numVertices]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...