Hello, I'm currently having trouble getting chunking to work for marching cubes. I've based my project off of Scrawks (https://github.com/Scrawk/Marching-Cubes) Project. This is my problem The important part: Code (CSharp): using UnityEngine; using System.Collections.Generic; public class Chunk : MonoBehaviour { public int width; public int height; public int length; public Vector3Int coord; public GameObject chunkObj; public Material chunkMat; public ChunkVoxelProvider chunkVoxelProvider; private List<GameObject> meshes = new List<GameObject>(); public float[] voxels; public void Generate(List<Chunk> chunks) { List<Vector3> verts = new List<Vector3>(); List<int> indices = new List<int>(); //The voxel array. voxels = new float[width * height * length]; //Cubes is faster and creates less verts, tetrahedrons is slower and creates more verts but better represents the mesh surface. Marching marching = new MarchingCubes(); //Surface is the value that represents the surface of mesh //For example the perlin noise has a range of -1 to 1 so the mid point is where we want the surface to cut through. //The target value does not have to be the mid point it can be any value with in the range. marching.Surface = chunkVoxelProvider.surface; //Get generated values from chunk provider. voxels = chunkVoxelProvider.Provide(width, height, length, coord.x, coord.y, coord.z); //The mesh produced is not optimal. There is one vert for each index. //Would need to weld vertices for better quality mesh. marching.Generate(voxels, width, height, length, verts, indices); //A mesh in unity can only be made up of 65000 verts. //Need to split the verts between multiple meshes. int maxVertsPerMesh = 30000; //must be divisible by 3, ie 3 verts == 1 triangle int numMeshes = verts.Count / maxVertsPerMesh + 1; for (int i = 0; i < numMeshes; i++) { List<Vector3> splitVerts = new List<Vector3>(); List<int> splitIndices = new List<int>(); for (int j = 0; j < maxVertsPerMesh; j++) { int idx = i * maxVertsPerMesh + j; if (idx < verts.Count) { splitVerts.Add(verts[idx]); splitIndices.Add(j); } } if (splitVerts.Count == 0) continue; Mesh mesh = new Mesh(); mesh.SetVertices(splitVerts); mesh.SetTriangles(splitIndices, 0); mesh.RecalculateBounds(); mesh.RecalculateNormals(); GameObject go = new GameObject("Mesh-" + i); go.transform.parent = transform; go.AddComponent<MeshFilter>(); go.AddComponent<MeshRenderer>(); go.GetComponent<Renderer>().material = chunkMat; go.GetComponent<MeshFilter>().mesh = mesh; go.transform.localPosition = new Vector3(-width / 2, -height / 2, -length / 2); meshes.Add(go); } } } I have no idea how I'd pass the neighboring voxel data in. Any help is appreciated.
It will be not helpfull for you as ask you asked long time ago but maybe someone alse (as me) will search for answer. You need to search for neighbours during marching cubes algorythm not after (ask parent to give you voxel at given position) https://gamedev.stackexchange.com/questions/53727/stitching-meshes-together
I had the same problem ('missing a cube between chunks') in my implementation. It actually makes sense when you think about it. In marching cubes, we generate the cube 'between coordinates'. This problem simply does not exist in a more minecraft-like blocky world. Here, for 0 to 1, we generate one cube, 1 to 2 another and so on. So for a 16 cube long chunk we generate 15 (!) such cubes. And that's the problem. We generate the last cube from 15 to 16, then we stop. The next chunk would start at 17 to 18 and continue from there. However, we never generated the 16 to 17 cube, which is the empty lines you can see in between the chunks. To fix this i simply included N+1 coordinates into the calculation for a N sized chunk, or more specifically, simply use 17x17x17 for a 16x16x16 sized chunk, since that's actually the amount of data we require to generate the 16 cubes in all directions.