• Advertisement
Sign in to follow this  

Increasing mesh surface tesselation help

This topic is 4492 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Ello all, My cel shading technique relies on high-poly models to look great, so what I'd like to be able to do when loading meshes into my engine is to increase the number of triangles in them (without changing the shape of the mesh) arbitrarily. I thought up and wrote my own simple algorithm to do it, which, unsurprisingly, isn't working. All it does is, for every face in a mesh, divide it into 4 faces by generating new vertices inbetween the actual vertices, and wind up 4 new triangles. However, when I do this, I get crashes later on when I'm asking DX to compute adjacency information and normal information (D3DX: Assertion failure! (d:\bt\130\private\multimedia\directx\dxg\d3dx9\mesh\tri3mesh.inl 1985): (pwFace[0] == iVertex1) || (pwFace[1] == iVertex1) || (pwFace[2] == iVertex1)). Here's my algorithm, if anyone has any idea what I'm doing wrong it'd be useful because I've looked at the actual mesh data produced and it all seems to make sense to me.
ID3DXMesh* newMesh = 0;
DuncEngineMesh::Vertex* vertices = 0;
WORD* indices = 0;
DuncEngineMesh::Vertex* newVertices = 0;
WORD* newIndices = 0;
int newIndex = 0; //index of where we write new index data
int newVertex = 0; //index of where we write new vertex data


//for each face
for (int i = 0; i < oldMeshNumIndices/3; i++)
//get vertices using face data
        Vertex zero = vertices[indices[i*3]];
	Vertex one = vertices[indices[i*3+1]];
	Vertex two = vertices[indices[i*3+2]];

	//calculate vertices in between zero, one and two
	Vertex zeroA((zero._x+one._x)/2,(zero._y+one._y)/2,(zero._z+one._z)/2);
	Vertex oneA((one._x+two._x)/2,(one._y+two._y)/2,(one._z+two._z)/2);
	Vertex twoA((two._x+zero._x)/2,(two._y+zero._y)/2,(two._z+zero._z)/2);

	//allocate them into new mesh vertex data
	newVertices[newVertex] = zero;
	newVertices[newVertex+1] = zeroA;
	newVertices[newVertex+2] = one;
	newVertices[newVertex+3] = oneA;
	newVertices[newVertex+4] = two;
	newVertices[newVertex+5] = twoA;

	//build 4 new triangles from new vertices
	newIndices[newIndex] = newVertex;
	newIndices[newIndex+1] = newVertex+1;
	newIndices[newIndex+2] = newVertex+5;

	newIndices[newIndex+3] = newVertex+1;
	newIndices[newIndex+4] = newVertex+2;
	newIndices[newIndex+5] = newVertex+3;

	newIndices[newIndex+6] = newVertex+3;
	newIndices[newIndex+7] = newVertex+4;
	newIndices[newIndex+8] = newVertex+5;

	newIndices[newIndex+9] = newVertex+5;
	newIndices[newIndex+10] = newVertex;
	newIndices[newIndex+11] = newVertex+1;

	//increment where we are in generating new data
	newVertex += 6; //we add 6 vertices to our new mesh each step
	newIndex += 12; //and 4 triangles



Thanks for any help, Duncan

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement