Submesh Triangles

I have a mesh, which need to use a lot of textures for each face.
My mesh has got like 2048 faces. Since mesh face should be represented as int array, there is a List with 6144 elements(2048*3).

I have used the following code:

var m = new Material[] {
    Resources.Load("mat1") as Material,
    Resources.Load("mat2") as Material,
    Resources.Load("mat3") as Material
};

secondLayer[j] = new GameObject();
secondLayer[j].AddComponent<MeshFilter>();
secondLayer[j].AddComponent<MeshRenderer>();
secondLayer[j].AddComponent<MeshCollider>();
secondLayer[j].GetComponent<Renderer>().materials = m;
secondLayer[j].name = "2nd_Mesh_#" + j;

var sMesh = secondLayer[j].GetComponent<MeshFilter>().mesh;
sMesh.Clear();

sMesh.vertices = sVertex;
sMesh.uv = sUv;
//sMesh.triangles = sFace.ToArray();

sMesh.subMeshCount = sFace.Count / 3;

var k = 0;
for (int i = 0; i < sFace.Count; i++)
{
    if (k >= sFace.Count)
        break;

    int[] tmp = { sFace[k], sFace[k + 1], sFace[k + 2]};
    sMesh.SetTriangles(tmp, i);

    k += 3;
}

sMesh.RecalculateNormals();

However, it does render only 3 of faces.

And if i uncomment line

sMesh.triangles = sFace.ToArray();

And comment SetTriangles, it does render everything:

Also, while debugging i noticed correct subMeshCount and Triangles array size(2048).
What I’m doing wrong?

Each submesh corresponds to a seperate material. You only have 3 materials in your array. Making each triangle a seperate submesh makes no sense. That’s like you create a seperate mesh object for each triangle. Having a seperate material for each triangle is horrible for performance as each material / submesh is a seperate drawcall.

That’s why you usually use a single material with an atlas texture and simply map each triangle to a different area on the atlas by using appropriate UV coordinates for each triangle.