Я пытаюсь десериализовать сетку, и в результате получается беспорядочный беспорядок в треугольниках с пропуском большого количества данных.Процесс идет прямо, я получаю байтовый массив и читаю позиции, нормали, цвета и устанавливаю индексы.Точно такой же байтовый массив в программе на 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:
Render Unity:
Как примечание, в OpenGL я могу передать цвета, нормали и вершины без необходимости индексации через атрибуты вершин.Есть ли в Unity аналог, чтобы мне не нужно было взрывать оперативную память, создавая ненужный индексный массив int [numVertices]?