Почему если в zSize или в xSise число будет больше чем 255, то весь меш ломается?
(Может найдётся человек, который мне поможет) Создаю меш с помощью этого скрипта:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshCreatorV2 : MonoBehaviour
{
Mesh mesh;
Vector3[] vertices;
int[] triangles;
Vector2[] uv;
public float cellSize;
public int xSize;
public int zSize;
float sample;
public float multiplier;
public float perlinSize;
public float xOffset;
public float yOffset;
void Awake()
{
mesh = GetComponent<MeshFilter>().mesh;
MakeDiscreteProceduralGrid();
UpdateMesh();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
MakeDiscreteProceduralGrid();
UpdateMesh();
}
}
void MakeDiscreteProceduralGrid()
{
vertices = new Vector3[(xSize + 1) * (zSize + 1)];
triangles = new int[xSize * zSize * 6];
for(int i = 0, z = 0; z <= zSize; z++)
{
for (int x = 0; x <= xSize; x++)
{
sample = Mathf.PerlinNoise(x * (cellSize / 10) * perlinSize + xOffset, z * (cellSize / 10) * perlinSize + yOffset);
vertices[i] = new Vector3(x * (cellSize / 10), sample * multiplier, z * (cellSize / 10));
i++;
}
}
int v = 0;
int t = 0;
for (int z = 0; z < zSize; z++)
{
for (int x = 0; x < xSize; x++)
{
triangles[t + 0] = v + 0;
triangles[t + 1] = v + xSize + 1;
triangles[t + 2] = v + 1;
triangles[t + 3] = v + 1;
triangles[t + 4] = v + xSize + 1;
triangles[t + 5] = v + xSize + 2;
v++;
t += 6;
}
v++;
}
}
void UpdateMesh()
{
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.uv = uv;
mesh.RecalculateNormals();
}
}
Все public переменные я ввожу в инспекторе. При любых значениях в zSize и xSize от 0 до 255 включительно меш строится нормально и шум Перлина работает хорошо, но если одно из этих значений или оба значения будут 256 или выше, то меш перестанет строиться нормально в сторону и будут появляться полигоны, которые пересекаются с другими полигонами (так быть не должно). На Unity версии 2019.4.32f1 выдавало ошибку "Expanding invalid MinMaxAABB". На версии Unity 2021.2.1f1 ошибок не выдаёт, но меш и там и там строится неправильно при значениях выше чем 255. Ссылка на проект: https://drive.google.com/drive/folders/1eeJotJjiQ2ixC4hTRxeo444ZNXGr2nvL?usp=sharing
Ответы (1 шт):
Описание Формат данных буфера индекса сетки.
Индексный буфер может быть 16-битным (поддерживает до 65535 вершин в сетке) или 32-битным (поддерживает до 4 миллиардов вершин). Формат индекса по умолчанию - 16 бит, так как это требует меньше памяти и пропускной способности.
Обратите внимание, что поддержка 32-битных индексов GPU не гарантируется на всех платформах; например устройства Android с графическим процессором Mali-400 их не поддерживают. При использовании 32-битных индексов на такой платформе в журнал будет занесено предупреждающее сообщение, и сетка не будет отображаться.
Изменение indexFormat устанавливает subMeshCount в единицу и очищает буфер индекса.