# Increasing mesh surface tesselation help

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

## 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

D3DXCreateMesh((oldMeshNumIndices/3)*4,oldMeshNumVertices*2,D3DXMESH_DYNAMIC,generalVertexDeclarationStruct,device,&newMesh);

//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
}

newMesh->UnlockIndexBuffer();
newMesh->UnlockVertexBuffer();

oldMesh->UnlockIndexBuffer();
oldMesh->UnlockVertexBuffer();


Thanks for any help, Duncan

Bump :)

1. 1
2. 2
3. 3
4. 4
Rutin
17
5. 5

• 11
• 21
• 12
• 11
• 41
• ### Forum Statistics

• Total Topics
631401
• Total Posts
2999871
×