[attachment=9981:tetra bad shade.png]
I am assuming that this is because of interpolation of normals. As I say my approach to create this tetrahedron was to use only 4 vertices and let the indices do the rest. Should I actually define 4 faces (12 vertices) and define the normals for each face. I know this latter approach would work but my question is should the former approach also work, or should I reserve the low vertex count solution only for high polygon count objects?
My code for defining the vertices, indices and normal is below:
PrimitiveVertexStruct vertices[]=
{
{ D3DXVECTOR3(0.0f,1.0f,0.0f), WHITE_VECTOR, ZERO_VECTOR3 }, //1
{ D3DXVECTOR3(1.0f,-1.0f,0.0f), RED_VECTOR, ZERO_VECTOR3 }, //2
{ D3DXVECTOR3(-1.0f,-1.0f,0.0f),BLUE_VECTOR, ZERO_VECTOR3 }, //3
{ D3DXVECTOR3(0.0f,0.0f,2.0f), BLACK_VECTOR, ZERO_VECTOR3 }, //4
};
m_numTetraVertices = sizeof(vertices) / sizeof(PrimitiveVertexStruct);
m_numTetraIndices=12;
DWORD indices[] =
{
0,1,3, //1,2,4
1,2,3, //2,3,4
2,0,3, //3,1,4
0,2,1 //1,3,2
};
//compute average normals
for(int i=0;i<m_numTetraVertices;i++) {
//indices of triangle
int i0=indices[i*3+0];
int i1=indices[i*3+1];
int i2=indices[i*3+2];
//vertices of triangle
D3DXVECTOR3 v0=vertices[i0].Pos;
D3DXVECTOR3 v1=vertices[i1].Pos;
D3DXVECTOR3 v2=vertices[i2].Pos;
//compute face normal
D3DXVECTOR3 e0=v1 - v0;
D3DXVECTOR3 e1=v2 - v0;
D3DXVECTOR3 normal;
D3DXVECTOR3 cross;
D3DXVec3Cross(&normal, &e0, &e1);
//add to any existing normals for that vertex
vertices[i0].Normal+=normal;
vertices[i1].Normal+=normal;
vertices[i2].Normal+=normal;
}