- Home /
Voxel mesh generation not working.
I am building a voxel engine, and everything seems to be working(no errors), but when I try to build the mesh, it gives me an empty mesh with 0 verts and 0 tris. I can't tell if it is a problem with my voxel generator or my mesh generator(3d arrays don't show up in the inspector).
Yes, I know that the generation should be on the world class, not the chunk, and I will move it there just as soon as I can make the Chunks work(I am currently testing this with a single chunk, which is a mesh filter, mesh renderer, and Chunk script.)
Also, I want to keep the mesh-making separate from the voxel making and mesh assigning, because I am going to later incorporate other modifications to the mesh (like smoothing). Thanks!
Here is the Chunk itself:
#pragma strict
var Voxels:Voxel[,,]=new Voxel[16,16,16];
var sample:Voxel[]=new Voxel[16];
var mesh:Mesh;
@ContextMenu("GenerateVoxels")
function Generate(){
var image : int[,]=new int[16,16];//image generation. Better gen will go here later.
for(var x:int=0;x<16;x++){
for(var y:int=0;y<16;y++){
image[x,y]=Mathf.RoundToInt(16*Mathf.PerlinNoise(x,y));
}
}//Image -> Voxels.Add Caves?
for(var xg:int=0;xg<16;xg++){
for(var yg:int=0;yg<16;yg++){
for(var zg:int=0;zg<16;zg++){
if(image[xg,yg]<= zg){
Voxels[xg,yg,zg]=new DirtVoxel();
}else{
Voxels[xg,yg,zg]=new AirVoxel();
}
}
}
}
}
@ContextMenu("RenderMesh")
function Render(){
mesh = ChunkRenderer.Render(Voxels);
print("Verts " + mesh.vertexCount);
print("Tris " + mesh.triangles.Length);
gameObject.GetComponent(MeshFilter).mesh=mesh;
}
And here is the ChunkRenderer class:
import System.Collections.Generic;
#pragma strict
static function Render(Voxels : Voxel[,,]):Mesh
{
var vertices : List.<Vector3> = new List.<Vector3>();
var triangles : List.<int> = new List.<int>();
for(var x:int=1; x<15; x++){
for(var y:int=1;y<15;y++){
for(var z:int=1;z<15;z++){
//iterate through all voxels in the chunk and detect solidity/transparency to determine faces
var voxel:Voxel = Voxels[x,y,z];
var top:Voxel=Voxels[x,y+1,z];
var bottom:Voxel=Voxels[x,y-1,z];
var front:Voxel=Voxels[x+1,y,z];
var back:Voxel=Voxels[x-1,y,z];
var right:Voxel=Voxels[x,y,z+1];
var left:Voxel=Voxels[x,y,z-1];
var vertexIndex:int;
if(voxel.solid){
if(top.transparent){
vertexIndex= vertices.Count;
vertices.Add(new Vector3(x-0.5,y+0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y+0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y+0.5,z+0.5));
vertices.Add(new Vector3(x-0.5,y+0.5,z+0.5));
// first triangle for the block top
triangles.Add(vertexIndex);
triangles.Add(vertexIndex+1);
triangles.Add(vertexIndex+2);
// second triangle for the block top
triangles.Add(vertexIndex+2);
triangles.Add(vertexIndex+3);
triangles.Add(vertexIndex);
}
if(bottom.transparent){ //CHECK WINDING ORDER!
vertexIndex= vertices.Count;
vertices.Add(new Vector3(x-0.5,y-0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y-0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y-0.5,z+0.5));
vertices.Add(new Vector3(x-0.5,y-0.5,z+0.5));
//first triangle for the block bottom
triangles.Add(vertexIndex);
triangles.Add(vertexIndex+1);
triangles.Add(vertexIndex+2);
//second triangle for the block bottom
triangles.Add(vertexIndex+2);
triangles.Add(vertexIndex+3);
triangles.Add(vertexIndex);
}
if(front.transparent){
vertexIndex= vertices.Count;
vertices.Add(new Vector3(x+0.5,y+0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y-0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y-0.5,z+0.5));
vertices.Add(new Vector3(x+0.5,y+0.5,z+0.5));
//first triangle for the block front
triangles.Add(vertexIndex);
triangles.Add(vertexIndex+1);
triangles.Add(vertexIndex+2);
//second triangle for the block front
triangles.Add(vertexIndex+2);
triangles.Add(vertexIndex+3);
triangles.Add(vertexIndex);
}
if(back.transparent){
vertexIndex= vertices.Count;
vertices.Add(new Vector3(x-0.5,y+0.5,z-0.5));
vertices.Add(new Vector3(x-0.5,y+0.5,z+0.5));
vertices.Add(new Vector3(x-0.5,y-0.5,z+0.5));
vertices.Add(new Vector3(x-0.5,y-0.5,z-0.5));
//first triangle for the block back
triangles.Add(vertexIndex);
triangles.Add(vertexIndex+1);
triangles.Add(vertexIndex+2);
//second triangle for the block back
triangles.Add(vertexIndex+2);
triangles.Add(vertexIndex+3);
triangles.Add(vertexIndex);
}
if(right.transparent){
vertexIndex= vertices.Count;
vertices.Add(new Vector3(x-0.5,y+0.5,z+0.5));
vertices.Add(new Vector3(x+0.5,y+0.5,z+0.5));
vertices.Add(new Vector3(x+0.5,y-0.5,z+0.5));
//first triangle for the block right
triangles.Add(vertexIndex);
triangles.Add(vertexIndex+1);
triangles.Add(vertexIndex+2);
//second triangle for the block right
triangles.Add(vertexIndex+2);
triangles.Add(vertexIndex+3);
triangles.Add(vertexIndex);
}
if(left.transparent){
vertexIndex= vertices.Count;
vertices.Add(new Vector3(x+0.5,y+0.5,z-0.5));
vertices.Add(new Vector3(x-0.5,y+0.5,z-0.5));
vertices.Add(new Vector3(x-0.5,y-0.5,z-0.5));
vertices.Add(new Vector3(x+0.5,y-0.5,z-0.5));
//first triangle for the block left
triangles.Add(vertexIndex);
triangles.Add(vertexIndex+1);
triangles.Add(vertexIndex+2);
//second triangle for the block left
triangles.Add(vertexIndex+2);
triangles.Add(vertexIndex+3);
triangles.Add(vertexIndex);
}
}
}
}
}//end loop
//build mesh
var mesh:Mesh = new Mesh();
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
return mesh;
}
i think it would be hard for someone to sort through your code, but there are many useful questions on here eg
http://answers.unity3d.com/questions/293607/tiling-uv-mapping.html
http://answers.unity3d.com/questions/321428/adding-mesh-collider-in-run-time-slow.html
http://answers.unity3d.com/questions/315059/how-to-improve-performance-while-generating-extrud.html
be sure to carefully note the GOTCHYA in Unity mesh, explained here and many times...
http://answers.unity3d.com/questions/417483/is-there-a-way-to-assign-meshverticesi-directly.html
Answer by Fattie · May 05, 2013 at 09:20 AM
if ( top.transparent )
wouldn't those be:
if ( NOT top.transparent ) ...
you could solve this in seconds with Debug.Log lines. Like Debug,Log("I am adding a left side, we are up to " + vertexIndex);
Thanks! It works! The problem was in the very beginning of the code, where the for loops didn't pick up on my air voxels, so there were no transparent faces.