web-dev-qa-db-ja.com

Unity 2018.1で64k以上の頂点を持つメッシュを使用する方法

Unityが32ビットのインデックスバッファーをサポートしていると聞きました。しかし、Unity 2018.1を試してみると、うまく機能しません。

私はこのようなコードでメッシュを構築しました:

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

私のシェーダーは、頂点カラーのアルファ値に従ってレインボーパターンを描画します。

256 x 256グリッドは問題ありませんが、512 x 512グリッドはその面積の1/4と多くの間違った三角形しか表示しません。

enter image description here

enter image description here

11
landings

メッシュバッファはデフォルトで16ビットです。 Mesh-indexFormat を参照してください:

インデックスバッファーは、16ビット(メッシュで最大65535の頂点をサポート)または32ビット(最大40億の頂点をサポート)のいずれかです。メモリと帯域幅が少なくて済むため、デフォルトのインデックス形式は16ビットです。

コードの残りの部分をあまり注意深く見ていなくても、32ビットバッファーを設定していないことに注意してください。試してください:

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